21.09.2013 Views

Climbexion revision control voor softwarewerkplaatsen Henk ...

Climbexion revision control voor softwarewerkplaatsen Henk ...

Climbexion revision control voor softwarewerkplaatsen Henk ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Climbexion</strong><br />

<strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong><br />

<strong>Henk</strong> Pietersma<br />

2008-11-05


Inhoudsopgave<br />

1 Inleiding............................................................................................................................................5<br />

1.1 Achtergrond..............................................................................................................................5<br />

1.2 De organisatie...........................................................................................................................6<br />

1.2.1 Inleiding............................................................................................................................6<br />

1.2.2 Projects en Products..........................................................................................................7<br />

1.2.3 De teams..........................................................................................................................10<br />

1.2.4 Het werk..........................................................................................................................11<br />

1.2.5 Enige slotopmerkingen...................................................................................................13<br />

1.3 De televisie als bedrijf............................................................................................................20<br />

1.4 Televisie, de software..............................................................................................................25<br />

1.4.1 Architectuur en component modellen.............................................................................25<br />

1.4.2 Robuuste overgangen......................................................................................................26<br />

1.4.3 Folder structuur en builds ..............................................................................................28<br />

1.4.4 Afbakening NXP ............................................................................................................29<br />

1.4.5 Diversity .........................................................................................................................30<br />

1.4.6 Koala / Horcom...............................................................................................................32<br />

1.4.7 Power modes en hardware die geen deel uitmaakt van het audio/video platform..........37<br />

1.4.8 Pumps en pump engines..................................................................................................38<br />

1.4.9 MIPS recovery................................................................................................................40<br />

1.4.10 Test binaries ..................................................................................................................41<br />

1.4.11 Tools..............................................................................................................................41<br />

1.4.12 Version <strong>control</strong>.............................................................................................................42<br />

1.4.13 Instrumentation.............................................................................................................43<br />

1.4.14 Slot opmerkingen..........................................................................................................44<br />

1.5 Televisie, de hardware............................................................................................................48<br />

1.6 De testplek..............................................................................................................................50<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system...........................................................................................52<br />

2.1 De basis...................................................................................................................................52<br />

2.2 Begrippen................................................................................................................................54<br />

2.2.1 Basisstructuur..................................................................................................................54<br />

2.2.2 De organisatie van het geheel aan drawers.....................................................................62<br />

2.2.3 De organisatie van pools.................................................................................................67<br />

2.2.4 De organisatie van snapshots..........................................................................................68<br />

2.2.5 Other-focused files..........................................................................................................71<br />

2.2.6 Envelopes........................................................................................................................75<br />

2.2.7 Baseline supplements, external envelopes......................................................................79<br />

2.2.8 Resources........................................................................................................................81<br />

2.3 Metadata..................................................................................................................................84<br />

2.3.1 Inleiding..........................................................................................................................84<br />

2.3.2 Attributes, soorten en maten............................................................................................84<br />

2.3.3 Templates, wizards, pretty printing, macro's, en zo........................................................85<br />

2.3.4 File-type..........................................................................................................................87<br />

2.3.5 Entity type.......................................................................................................................90<br />

2.3.6 Restricties op kins...........................................................................................................92<br />

2.3.7 Classifications ten behoeve van export limitations.........................................................92<br />

2.3.8 Original en neighbor.......................................................................................................97<br />

2.3.9 Base en labored...............................................................................................................98<br />

2.3.10 Kin references...............................................................................................................98<br />

2.3.11 Attributes van drawer, package, pool, machine.............................................................98<br />

2.3.12 Tenslotte........................................................................................................................99


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2.4 Werkwijzen...........................................................................................................................100<br />

2.4.1 Merging.........................................................................................................................100<br />

2.4.2 Synchronisatie...............................................................................................................106<br />

2.4.3 Synchronisaties tussen satellite en working-tree...........................................................107<br />

2.4.4 Het werken met team-drawer, transfer-drawer en satellite...........................................109<br />

2.4.5 Een geabonneerd package inlijven................................................................................115<br />

2.4.6 Het overnemen (adopt) van envelopes uit een sister-project........................................116<br />

2.4.7 Undo envelope...............................................................................................................118<br />

2.4.8 synchroniseren van eigen packages met die van een sister-project (adopt merge).......119<br />

2.4.9 Gemeenschappelijk beheerde packages........................................................................122<br />

2.4.10 Baseline samenstellen.................................................................................................123<br />

2.4.11 Project dependencies...................................................................................................124<br />

2.4.12 Informatie, werkelijkheid, gedistribueerd systeem.....................................................125<br />

2.5 Planning & Tracking en Repositories...................................................................................131<br />

2.5.1 Introductie.....................................................................................................................131<br />

2.5.2 Relaties met envelopes..................................................................................................133<br />

2.5.3 Composite Activities.....................................................................................................134<br />

2.6 Builds en Repositories..........................................................................................................137<br />

2.6.1 De invloed van builds op <strong>Climbexion</strong>...........................................................................137<br />

2.6.2 First class citizens of tarballs........................................................................................144<br />

2.6.3 Build Forest...................................................................................................................146<br />

2.6.4 Build bij NXP................................................................................................................148<br />

2.6.5 Versnipperingen.............................................................................................................149<br />

2.6.6 Other-focused build results...........................................................................................152<br />

2.6.7 Conclusies.....................................................................................................................153<br />

2.6.8 Build extra's. DianPush Build.......................................................................................153<br />

2.7 Security.................................................................................................................................168<br />

2.7.1 Security entiteiten ........................................................................................................168<br />

2.7.2 Security doelen en middelen.........................................................................................169<br />

2.7.3 Gentlemen agreements..................................................................................................172<br />

2.8 Overige aspecten...................................................................................................................176<br />

2.8.1 Status en Progressie......................................................................................................176<br />

2.8.2 Het top package.............................................................................................................178<br />

2.8.3 Locks.............................................................................................................................179<br />

2.8.4 Notifications..................................................................................................................184<br />

2.8.5 Pool operaties................................................................................................................185<br />

2.8.6 Importeren, Exporteren.................................................................................................188<br />

2.8.7 Virtualisatie...................................................................................................................191<br />

2.8.8 Begrenzen?....................................................................................................................192<br />

2.8.9 Gebruikersvriendelijke? id's..........................................................................................197<br />

2.8.10 Losse eindjes...............................................................................................................200<br />

2.9 Slotopmerkingen...................................................................................................................202<br />

3 Methodische probleem beschrijving.............................................................................................206<br />

3.1 Inleiding................................................................................................................................206<br />

3.1.1 ORM..............................................................................................................................206<br />

3.1.2 Problem frames.............................................................................................................206<br />

Pagina: 3 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3.1.3 JSP.................................................................................................................................207<br />

3.1.4 HCI................................................................................................................................208<br />

3.2 Context diagram....................................................................................................................210<br />

3.3 Repository Database.............................................................................................................215<br />

3.3.1 Envelopes......................................................................................................................215<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)..................................................................218<br />

3.4.1 Interface Administrator machine / SCM machine.........................................................221<br />

3.4.2 Interface Administrator / Machine................................................................................222<br />

4 Licentie.........................................................................................................................................230<br />

Pagina: 4 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1 Inleiding<br />

1 Inleiding<br />

1.1 Achtergrond<br />

Sinds 1 oktober 2008 ben ik met pensioen gegaan. Voordien werkte ik bij het softwarehuis “TASS<br />

Software professionals” in Eindhoven, en was gedetacheerd bij NXP en droeg bij aan software<br />

<strong>voor</strong> digitale televisies.<br />

Dus maar wat hobbyen. In mijn jonge jaren heb ik me weleens bezig gehouden met programma<br />

beheer op IBM mainframes. Dit was gebaseerd op “partitioned datasets” en overdrachten van de<br />

afdeling programma-ontwikkeling naar de afdeling productie. Bij het openen van een programma in<br />

de ontwikkel-omgeving werd het programma eerst gezocht in de development dataset, en dan in de<br />

production dataset. In de productie-omgeving werd uitsluitend in de production dataset gezocht.<br />

Sindsdien heeft dergelijk beheer altijd mijn belangstelling gehad. Vandaar deze poging om een<br />

<strong>revision</strong> <strong>control</strong> system te definiëren. Trouwens, ik vindt het leuk om dingen opnieuw uit te vinden.<br />

Er zijn behoorlijk wat systemen om software op te bergen. Ik verwacht dan ook dat, als ik mijn<br />

gedachtespinsels op een website zet, dat de dingen dan niet ogenblikkelijk uit mijn handen gerukt<br />

zullen worden omdat iedereen erom zit te springen. Anderzijds hoop ik toch ook dat anderen mijn<br />

studie belangwekkend vinden.<br />

Voor mijn analyses heb ik mijn kennis van de NXP afdeling gebruikt waar ik het laatst gewerkt heb.<br />

Hierop kun je echter niet blindvaren. Ik heb geen documenten of software mee naar huis genomen,<br />

geen interviews gehouden, of mensen gebeld als ik iets niet wist, kortom als ik iets niet wist heb ik<br />

mijn duim gebruikt. Als ik dacht dat precisie schadelijk kon zijn <strong>voor</strong> NXP of een klant, dan ben ik<br />

vaag gebleven, of heb maar wat verzonnen.<br />

Als het al geleerd is wat ik beschrijf dan is het in ieder geval kamergeleerdheid. Wees<br />

gewaarschuwd.<br />

Voor de domein beschrijving en het eisen pakket probeer ik Niam (tegenwoordig ORM) en<br />

Problem frames te gebruiken. Dergelijke specificaties heb ik tot nu toe nooit hoeven te maken, dus<br />

ik ben benieuwd of het lukt.<br />

Het systeem dat ik beschrijf heeft als belangrijkste kenmerk dat het niet triviaal is. Hopelijk is het<br />

niet een zuivere kopie van een bestaand systeem. Te hanteren methoden zijn beschreven in:<br />

1. "Information Modeling and Relational Databases. second edition" van Terry Halpin en Tony<br />

Morgan (Morgan Kaufmann Publishers ISBN: 978-0-12-373568-3)<br />

2. "Problem Frames, Analyzing and structuring software development problems" van Michael<br />

Jackson. (Addison-Wesley ISBN 0-201-59627-X)<br />

De taal waarin ik schrijf is Nederlands hoop ik. Als het mij lukt om mijn ideeën in redelijk<br />

Nederlands en begrijpelijk op papier te krijgen, kan ik ze altijd nog vertalen in slecht Engels. Voor<br />

de termen die te maken hebben met het <strong>revision</strong> <strong>control</strong> system, trouwens <strong>voor</strong> veel vaktermen,<br />

gebruik ik Engels, die zijn dus reeds “vertaald”.<br />

Pagina: 5 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

1.2 De organisatie<br />

1.2.1 Inleiding<br />

In de jaren 1980-2010 heb ik onder meer deelgenomen aan diverse projecten <strong>voor</strong> Philips<br />

Semiconductors. Een van de dingen die toen opviel is de toewijzing van ontwikkelingen aan de<br />

diverse laboratoria. Ieder laboratorium kreeg een aandeel in een nieuw te ontwikkelen chips-set.<br />

Daar zullen best allerlei rationele argumenten <strong>voor</strong> geweest zijn, maar toch, ik denk dat de<br />

belangrijkste reden was dat ze verslaafd waren aan internationale samenwerking. En sindsdien heb<br />

ik eigenlijk nooit anders ervaren.<br />

Voor wat betreft de TV ontwikkeling bij de eeuw overgang: Phiiips SC (Semiconductors, later<br />

NXP) en Philips CE (Consumer Electronics) waarmee werd samengewerkt waren strikt<br />

georganiseerd in markt segmenten. Er waren teams die de low-end markt bedienden, teams <strong>voor</strong> de<br />

mid-range, en teams <strong>voor</strong> de high-end markt. Ik werkte in het high-end segment. Traditioneel wordt<br />

daar het maken van een televisie gezien als een edel handwerk, met nauwelijks concessies: goed is<br />

niet goed genoeg. Features ontstonden in het high-end segment, en vonden vandaar uit hun weg<br />

naar mid-range en low-end. Dit werd “down-draining” genoemd, en besloeg een aantal jaar. Ieder<br />

team had zijn eigen software stack en hardware range waarin de nieuwe functionaliteit werd<br />

aangebracht. In de periode dat ik er werkte vond feitelijk een integratie plaats van mid-range en<br />

high-end. Down-draining hield op te bestaan. Mid-range werd “uitgekleed” high-end, in ieder geval<br />

in mijn vakgebied: de software.<br />

De afdeling bij NXP in Eindhoven waar<strong>voor</strong> ik werkte van 2002 tot in 2008 ontwikkelde software<br />

<strong>voor</strong> hybride analoge/digitale televisies. Technisch zijn het digitale televisies want analoge signalen<br />

worden zo snel mogelijk omgezet naar digitale stromen. Alle bewerkingen van decoderen tot het<br />

schrijven op een LCD of plasma scherm vinden plaats door de stroom te converteren van het ene<br />

digitale formaat in het andere (decoding), of door de digitale informatie te wijzigen (bewerking).<br />

Hybride zijn ze omdat ze zowel analoge video en audio input kunnen weergeven op beeldscherm en<br />

speaker, als ook digitale. Ook kunnen ze analoge output maken, door een digitale stroom om te<br />

zetten in een analoge, net <strong>voor</strong> hij de tv verlaat.<br />

Toen ik in 2002 door NXP werd ingehuurd, werd een belangrijk deel van de software ontwikkeld in<br />

Eindhoven, en een ander deel in Sunnyvale. In 2008 vindt het grootste deel van de ontwikkeling<br />

plaats in Bangalore en een klein deel in Eindhoven, en nog enige drivers in Hamburg.<br />

De software die NXP levert is bestemd <strong>voor</strong> hun one-chip TV. Deze ene chip bevat een aantal AD<br />

en DA converters, Micro-<strong>control</strong>lers zijn in gebruik als digitale signaal processors (DSP's) en er<br />

zijn enige computers. De computers zijn:<br />

● een Intel 8051 : standby processor,<br />

● een MIPS: besturingscomputer<br />

● enige (één of meer) TriMedia's: signaal bewerkingen.<br />

De software van NXP op deze computers moet samenwerken met de software van TV fabrikanten,<br />

de set-makers. Ook gespecialiseerde softwarehuizen leveren software <strong>voor</strong> gepatenteerde of<br />

gestandaardiseerde functies. Het geheel komt uiteindelijk in uw TV thuis, tenminste als uw TV een<br />

NXP chip bevat. Volgens één of andere rare conventie wordt het programmeren van micro<br />

<strong>control</strong>lers gerekend tot “hardware” en het programmeren van de drie typen computers tot<br />

Pagina: 6 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

“software”. Dit stuk gaat dan ook over het programmeren van die drie computers, en dan <strong>voor</strong>al<br />

programmeren op de computer waarbij ik betrokken was: de MIPS.<br />

NXP koopt het benodigde operating system <strong>voor</strong> de MIPS (Linux), en de real-time kernel <strong>voor</strong> de<br />

TriMedia's. Ook (cross) compilers, debuggers, en development systems worden gekocht. Zelf maakt<br />

ze de software <strong>voor</strong> de standby processor, het merendeel van de software op de TriMedia's, en het<br />

grootste deel van de drivers en hun aansturing op de MIPS.<br />

Als een nieuwe chip wordt ontwikkeld wordt ook het NXP aandeel van de software ontwikkeld. De<br />

software is deels gebaseerd op de software van de chip die daarvóór ontwikkeld werd. Dit gebeurt<br />

hoofdzakelijk in Bangalore. Nieuwe ontwikkelingen op het gebied van signaal bewerking vinden<br />

plaats in Eindhoven. Sommige drivers worden ontwikkeld in Hamburg. De TV waarop deze<br />

software wordt getest heet “reference design” Zo'n televisie komt vrij snel na de start van de<br />

software ontwikkeling beschikbaar <strong>voor</strong> testen, dus de chip is al eerder ontwikkeld. De<br />

ontwikkeling van chip en software vindt plaats in samenwerking met een belangrijke klant, meestal<br />

Consumer Electronics van Philips. Omdat de televisie standaards in de Verenigde Staten van Noord<br />

Amerika nogal afwijken van die in Europa worden er vaak 2 reference design televisies gemaakt.<br />

1.2.2 Projects en Products<br />

NXP zoekt een tv fabrikant om samen een nieuwe generatie televisies te ontwikkelen. NXP<br />

ontwikkelt de chip, en de set-maker (de klant) ontwikkelt de televisie.<br />

Waar NXP begint met een reference design, daar begint de klant met een standaard design. Hierin<br />

Pagina: 7 / 230<br />

Schematische <strong>voor</strong>stelling van de werkwijze<br />

In de eerdere projecten werd veel aandacht besteed aan design documenten en de design fase, in<br />

de latere projects werd hieraan minder aandacht besteed: “er is immers reeds een framework, de<br />

nieuwe software en de wijzigingen hoeven er alleen maar in te passen”.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

ontwikkelt de klant zijn noviteiten. De software die door de klant ontwikkeld wordt is (deels)<br />

gebaseerd is op de software van zijn vorige televisies. Datzelfde geldt <strong>voor</strong> het reference design: het<br />

is <strong>voor</strong> een deel gebaseerd op <strong>voor</strong>gaande software en hardware. Om deze designs te maken vindt er<br />

uitwisseling van kennis, hardware en software plaats, in het design project. NXP houdt er een<br />

reference board met software aan over, dat uitgangspunt is <strong>voor</strong> de verkoop aan andere klanten. De<br />

klant houdt er een standaard board en software aan over, die het uitgangspunt is <strong>voor</strong> zijn uit te<br />

brengen televisies.<br />

Zodra een verkoopbare televisie is gespecificeerd en een prototype beschikbaar komt, start een<br />

“design-in” project. In dit project wordt de software van NXP en klant passend gemaakt <strong>voor</strong> een<br />

TV van de klant. De NXP software is gebaseerd op het reference design, maar bevat wijzigingen die<br />

noodzakelijk zijn <strong>voor</strong> de TV of de stijl van de klant.<br />

Als het reference design klaar is, en de klant, waarmee is ontwikkeld, een afgesproken <strong>voor</strong>sprong<br />

heeft op zijn concurrenten, dan worden ook andere TV fabrikanten bediend met design-in projects.<br />

Dit vindt plaats in zowel Bangalore als Eindhoven, maar gaat naar Bangalore. In feite was ik in<br />

Eindhoven bijna de laatste die het licht uitdeed.<br />

Sommige TV fabrikanten ontwikkelen helemaal geen software. Tot <strong>voor</strong> kort bediende NXP ze met<br />

een complete software stack. Tegenwoordig worden de “applicatie en middleware delen” uitbesteed<br />

aan gespecialiseerde softwarehuizen.<br />

Een aantal projects zijn tegelijk aan de gang. Tussen deze projects vindt uitwisseling plaats van<br />

verbeteringen en nieuwe ontwikkelingen in de software.<br />

Meestal gebruikt de klant de chip in meerdere TV sets. Er komt dan een design-in project <strong>voor</strong> elk<br />

groepje TV sets dat erg op elkaar lijkt. Een groepje dat te sterk afwijkt is reden <strong>voor</strong> een ander<br />

design-in project. De software is dan gebaseerd op die van van een vorige design-in, of op een<br />

standaard design. Deze projects vonden aan de NXP kant plaats in Eindhoven maar gaan ook naar<br />

Bangalore.<br />

Deze keuze <strong>voor</strong> design-in projects en de keuze van NXP om zijn reference designs te baseren op<br />

<strong>voor</strong>gangers laat ons terecht vermoeden dat we te maken hebben met product familie structuren,<br />

compleet met huwelijken en kinderen en zo. Op een willekeurig tijdstip zijn van zo'n televisie<br />

familie enkele modellen in ontwikkeling, enkele modellen worden gefabriceerd, en enkele modellen<br />

staan in de schappen in de winkels. Voor de chip familie geldt iets soortgelijks: in een tijdsvenster<br />

zijn er slechts een paar typen in ontwikkeling, en worden slechts enkele typen gefabriceerd. Vaak<br />

zijn er enige varianten die ongeveer samen ontwikkeld worden, bij<strong>voor</strong>beeld een power-chip en een<br />

compatible eco-chip.<br />

Sommige klanten hanteren een fictief project: het backbone project. Dit is een <strong>voor</strong>tzetting van het<br />

design project. Wijzigingen in een project worden, als ze algemeen bruikbaar zijn, ook gebruikt om<br />

de backbone software te verbeteren. Nieuwe design-in projects worden gebaseerd op de laatste<br />

versie van het backbone project.<br />

NXP gebruikt design-in projects om zijn reference design te verbeteren. Voor NXP is het reference<br />

model de backbone.<br />

Een tv project wordt geregeerd door deadlines, zoals een expositie op een beurs, een sport<br />

Pagina: 8 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

evenement, een seizoen, en de aanvraag van een certificaat. Met een certificaat geeft een<br />

onafhankelijke commissie aan dat ze heeft vastgesteld dat de televisie aan een standaard voldoet.<br />

Vaak moet een aanvraag ruim van tevoren worden ingediend, en uitstel is afstel, dan moet opnieuw<br />

ruim van te voren een aanvraag worden ingediend. Elk certificaat is een stikker met logo op de<br />

televisie en/of de doos waar hij in zit. Na de aanvraag is er dus een deadline.<br />

De software “fasen” development en verification/integration zijn geen echte fasen maar lopen in<br />

elkaar over: op een gegeven moment werkt men niet meer aan ontwikkeling maar nog uitsluitend<br />

aan problemen, of aan tussentijdse wijzigingen. Dit komt omdat een nieuw project gebaseerd is op<br />

software van een <strong>voor</strong>gaand project. Daardoor beschikt men al zeer vroeg over een werkbaar<br />

geheel, en kan vanaf het begin reeds gewerkt worden aan de verification/integration fase, en wat<br />

betreft de verification beginnen de testers dan ook onmiddellijk met het genereren van problem<br />

reports. Voor design-in projects geldt dit meer dan <strong>voor</strong> (reference) design projects, waarin veel<br />

innovaties zitten, en waarin <strong>voor</strong> NXP naast een nieuwe TV chip ook overgangen kunnen zitten<br />

naar andere microcomputers, andere operating systems, andere compilers, andere debuggers<br />

enzo<strong>voor</strong>t. De “mijlpaal” wordt dus niet bereikt als groen licht wordt gegeven <strong>voor</strong> de start van de<br />

integratie/verificatie fase, maar als de development fase uitgedoofd is. Deze mijlpaal wordt niet<br />

langer beschouwd als een go/no-go beslispunt. Zelfs is het zo dat vaak pas met een ontwikkeling<br />

van een nieuw feature begonnen wordt als de integratie op orde is, en dan zodra een specialist<br />

beschikbaar komt.<br />

In televisie projects zie je dat veel mijlpalen worden gedefinieerd door het overall project, dat gaat<br />

van idee tot de televisie bij de mensen thuis. De go / no-go mijlpalen en audits worden bepaald door<br />

interactie tussen markt analyse, research, hardware ontwikkeling, software ontwikkeling,<br />

ontwikkeling en het opzetten van (proef) fabricage lijnen, distributie, certificering, aankondiging en<br />

demonstratie, en dergelijke. De risico's <strong>voor</strong> een volgend traject in één of enkele van de disciplines<br />

zijn in principe <strong>voor</strong> een belangrijk deel afhankelijk van de opgeleverde kwaliteit van <strong>voor</strong>gaande<br />

trajecten in alle disciplines. De risico's worden definitief bepaald aan de <strong>voor</strong>avond van zo'n traject.<br />

De resultaten van audits en externe analyses moeten aangeven dat een traject gestart mag worden,<br />

en mogelijk ook op welke punten opleveringen in <strong>voor</strong>gaande trajecten moeten worden verbeterd.<br />

Uiteraard werkt men in projects het liefst met strikt opeenvolgende fasen, zodat dezelfde <strong>voor</strong>avond<br />

ook een “stop going / don't stop going” beslissing oplevert <strong>voor</strong> de organisatie die de <strong>voor</strong>gaande<br />

fase realiseerde, en <strong>voor</strong> het wel of niet vrijgeven van de mensen en middelen die daarbij gebruikt<br />

werden.<br />

De projects om een televisie te maken horen te worden gekenmerkt door een grote mate van<br />

beheersing van het hele proces. Op elk moment moet duidelijk zijn wat er bereikt is en wat er nog<br />

moet gebeuren. Onduidelijkheden in het ontwerp mogen eigenlijk niet <strong>voor</strong>komen, daar zijn de<br />

research projects <strong>voor</strong>. Tegenvallers kunnen gemakkelijk uitgroeien tot een ramp. Vooraf moet er al<br />

een gedetailleerd inzicht zijn, wat het product behelst dat men maakt, welke resources er nodig zijn<br />

om het project te realiseren, en welke resources <strong>voor</strong>handen zijn. Gedurende het project wordt<br />

dagelijks de <strong>voor</strong>tgang ge<strong>control</strong>eerd van alle werkopdrachten: hoe staat het met de analyse, de<br />

programmering, de verificatie? Er wordt bijgehouden welke tests gepasseerd zijn, welke nog niet<br />

kunnen worden gedaan, en welke een fout resultaat opleveren. In een project worden geregeld<br />

audits gehouden met lange checklists, om te bepalen of een mijlpaal is bereikt.<br />

Hiermee alleen lukt het niet om tijdig een goede kwaliteit televisie af te leveren. De ene keer is er<br />

sprake van een “Jantje van Leiden” in de eerdere stadia van het project, de andere keer moet de<br />

Pagina: 9 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

televisie in de schappen staan <strong>voor</strong> een wereldkampioenschap, en zo is er altijd wel wat. Een project<br />

wordt dan ook vaak gerealiseerd door de tomeloze inzet en het overwerk van de medewerkers.<br />

1.2.3 De teams<br />

De teams die deze projects bemannen zijn gestructureerd volgens specialismen. Binnen NXP<br />

kennen we zoal:<br />

● Operating System en standby processor.<br />

● Frontend<br />

● Decoding<br />

● Video bewerking.<br />

● Audio<br />

● Performance<br />

Al naar gelang de behoefte, of de smaak van de teamleider zijn er veel subteams met weinig<br />

specialismen per subteam, of een weinig gestructureerd team met veel specialismen binnen het<br />

team. Ook zijn er design-in teams die werken <strong>voor</strong> een enkele klant (account gericht), en teams die<br />

(successievelijk) werken <strong>voor</strong> meerdere klanten.<br />

Van oudsher was er in televisies de hardware die het werk deed, en de software die de user interface<br />

bediende en de hardware aanstuurde. Met de digitale TV ontstaat er ook software die het werk doet:<br />

Video en audio bewerking. De specialisten die deze software maken zitten in een ander team dan de<br />

andere specialisten die zich bezighouden met besturing en drivers. Ze worden meer ingezet in<br />

ontwikkeling en reference design projects en minder in design-in.<br />

Iemand die nieuw in het televisie vak begint krijgt verantwoordelijkheid <strong>voor</strong> een deel van de<br />

software, bij<strong>voor</strong>beeld de tuner software. Hij of zij wordt dan al snel specialist. Werknemers van<br />

NXP volgen een ontwikkelingsplan, waarbij ze ook op andere delen en in andere teams worden<br />

ingezet zodat ze na een tijdje generalist worden. Inhuurkrachten volgen geen plan maar worden al<br />

naar gelang de behoefte na een tijdje ingezet op andere delen van de software. Sommigen worden<br />

zo generalist, anderen beheersen na een tijdje één of meerdere specialismen. Beide, medewerker en<br />

inhuurkracht, wordt een TV cursus aangeboden om meer algemeen inzetbaar te zijn.<br />

Teams met specialisten zijn van nature wat groter dan teams met generalisten, omdat er voldoende<br />

Pagina: 10 / 230<br />

schematic matrix organization


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

dekking in TV kennis moet zijn in een project. De wat grotere teams worden ingezet op design<br />

projects of op veel design-in projects tegelijk. Kleinere teams worden ingezet op enkele projects<br />

tegelijk, bij<strong>voor</strong>beeld op OEM design-in projects, waarin ze in een rap tempo het éne na het andere<br />

project realiseren. Indien het design of design-in project veel moet vernieuwen, dan structureert<br />

men het team meestal volgens specialisme.<br />

Sommige generalisten worden factotum, en zijn niet vast aan een team verbonden, maar worden<br />

ingezet daar waar de druk het hoogst is. Sommige specialisten worden goeroe en worden daar<br />

ingezet waar hun kennis het meest nodig is.<br />

Vaak is een team in een project geografisch gescheiden van de anderen. Soms worden teams bij<br />

elkaar gebracht in één gebouw, we spreken dan van een one-roof project. De teams van de klant en<br />

die van NXP blijven vaak gescheiden, maar er vinden wel detacheringen plaats, ter bevordering van<br />

de communicatie. Soms maar niet vaak is er een one-roof team van een klant en NXP. De spreiding<br />

van teams van NXP en klant over de wereld leiden verder tot veel telefonisch vergaderen, zowel<br />

reguliere meetings, als ad hoc vergaderingen vinden telefonisch plaats.<br />

1.2.4 Het werk<br />

Gedurende de development activiteiten van de software werken de ontwikkelaars, testers en<br />

integrators planmatig. Software wordt (her)ontwikkeld en geverifieerd met reviews en tests volgens<br />

plan door testers en ontwikkelaars. De nadruk bij het testen ligt bij component en package tests.<br />

Reviews worden gehouden <strong>voor</strong> documenten, c files, test scripts en zo.<br />

Tijdens de verificatie en integratie fase worden de ontwikkelaars gestuurd door problem reports,<br />

testers volgen deels een integratie test plan, waarbij de nadruk komt te liggen bij product tests en<br />

tests van lagen. Verder verifiëren ze opgeloste problems, met name in baseline tests. Integrators<br />

brengen een nieuwe baseline uit per vastgestelde periode en incorporeren baseline van andere teams<br />

liefst éénmaal in dezelfde periode. In de laatste fase van het integratie traject, de maturing phase,<br />

worden de software wijzigingen van NXP per opgelost problem doorgegeven aan andere teams.<br />

Regelmatig worden nieuwe baselines van de eigen software verstuurd naar andere design groepen:<br />

werk van de build manager, uiteraard na een forse baseline test: werk van een tester, en <strong>voor</strong>zien<br />

van een baseline report: werk <strong>voor</strong> de integrator. Regelmatig worden nieuwe baselines van de<br />

software van andere teams in het project in ontvangst genomen. Ook dit is werk van de build<br />

manager. Zo'n nieuwe baseline moet ook in gebruik worden genomen: werk <strong>voor</strong> de integrator.<br />

Meestal worden baselines eens per twee weken uitgegeven, soms wekelijks of maandelijks,<br />

afhankelijk van de project-fase en de afspraken. Meestal duurt het enkele dagen <strong>voor</strong>dat een nieuwe<br />

baseline door een team in gebruik wordt genomen, soms duurt het langer, en soms wordt een<br />

baseline overgeslagen.<br />

Binnen NXP sprak men over releases waar ik spreek over baselines. In software configuration<br />

management wordt een snapshot dat een naam heeft gekregen, en waar<strong>voor</strong> kwaliteitseisen zijn<br />

gerealiseerd, over het algemeen baseline genoemd. Releases zijn –,vind ik –, gerelateerd aan<br />

eindproducten, die <strong>voor</strong> gebruik beschikbaar zijn gesteld aan eindgebruikers, en soms <strong>voor</strong> testen<br />

door eindgebruikers zoals alfa en bèta releases .<br />

Pagina: 11 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

In het plaatje van het baseline schema is te zien dat er nog patches moeten worden ontwikkeld<br />

nadat een baseline is uitgebracht. Dat is eigenlijk een zwakte bod, het had <strong>voor</strong>komen moeten<br />

worden.<br />

Zo'n baseline schema eist wel een zekere robuustheid van de software. Baseline D van package Cup<br />

Pagina: 12 / 230<br />

Baseline schema


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

moet compatibel zijn met baseline T-1 en T van package Saucer, en met de ontwikkeling van<br />

package Saucer tot baseline T+1 en verder. Baseline T van package Saucer moet compatibel zijn<br />

met baseline D-1 en D van package Cup en met de ontwikkeling van package Cup tot baseline D+1<br />

en verder. Eventueel kunnen in de nadagen van een baseline “ baseline supplements” (patches)<br />

gebruikt worden om compatibel te blijven.<br />

Het getoonde baseline schema is echt een schematische <strong>voor</strong>stelling van zaken, in de praktijk komt<br />

het <strong>voor</strong> dat een team wel eens een baseline overslaat van een geabonneerd package.<br />

Bij parallel lopende projects worden vaak wijzigingen uitgewisseld. Soms gebeurt dit periodiek.<br />

Hierbij is de integrator betrokken, vaak samen met ontwikkelaars. In ieder geval is er uitwisseling<br />

tussen backbone en design-in projects, dit geldt <strong>voor</strong> de backbone van de klant, en die van NXP.<br />

Naast het werken aan de <strong>voor</strong>tgang is er nog het terugkerende routinewerk: dagelijks ('s nachts<br />

<strong>voor</strong>al) wordt vrijgegeven software van de ontwikkelaars ingelijfd in de team software. Voordat dat<br />

gebeurt vindt eerst een build en een regressie test plaats. Dit is natuurlijk alleen routinewerk als de<br />

build en de test goed verlopen, anders moet er ook uitgezocht worden welke software fout is, dat<br />

gebeurt <strong>voor</strong>al de volgende morgen. Betrokken hierbij zijn de build manager en een tester,<br />

eventueel bijgestaan door een software engineer.<br />

Software moet vaak geanalyseerd en getest worden. Hier<strong>voor</strong> is veel hardware nodig in de vorm<br />

van televisies, audio/video generators, dvd players, antenne pluggen met daarachter een netwerk<br />

aan tv zenders, meet apparatuur, en dergelijke. Het onderhoud van dit alles is het werk van de<br />

hardware specialisten.<br />

Voor planning en tracking van alle <strong>voor</strong>gaande activiteiten zorgt de change manager. Zij/hij werkt<br />

nauw samen met de change managers van de andere teams, en met die van het overall project.<br />

1.2.5 Enige slotopmerkingen<br />

Een design project heeft een relatief lange software development fase en een design-in project een<br />

relatief korte, tenminste wat betreft de NXP bijdrage.<br />

Marktontwikkelingen die niet <strong>voor</strong>zien zijn, tijdens het ontwerp van de chip, worden meestal<br />

opgelost door de klant die de elektronica uitbreidt met extra chips. Aan de <strong>voor</strong>kant van het signaal<br />

pad is dit in 2002 een HDMI chip geweest en in 2007 een MPEG4 chip. Aan de achterkant waar het<br />

beeldscherm aangestuurd wordt zijn dit in 2003 chips geweest <strong>voor</strong> scaling en natural motion bij<br />

grote plasma schermen, of grote LCD schermen. Recent (2008) heeft NXP een nieuwe ontwikkeling<br />

op het gebied van video nabewerking gestart op een afzonderlijke chip met een drietal TriMedia<br />

processors. Deze chip kan met de TV chip samenwerken, maar de TV chip kan ook standalone<br />

werken. De nieuw ontwikkelde chip kan ook zonder TV chip geleverd worden als backend van<br />

concurrerende oplossingen.<br />

In de tijd dat ik bij NXP werkte bleek dat een chip zeer snel veroudert Na een jaar design-in is er<br />

niemand meer die de chip nog wil. HDTV “ready” is opgevolgd door “Full HDTV”, één HDMI<br />

ingang moeten er vier zijn, internet aansluiting en DLNA zijn een vereiste, de beeldbewerking lijkt<br />

primitief vergeleken met de nieuwe algoritmen, de “punt” die over een LCD scherm raast moet niet<br />

Pagina: 13 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

alleen het kristal openen dat hij passeert, maar ook het backlight regelen (dit is een vereenvoudigde<br />

<strong>voor</strong>stelling van zaken), enzo<strong>voor</strong>t. Men zoekt naar een kortere doorlooptijd van design projects.<br />

Want nu zorgt de tijd die nodig is <strong>voor</strong> software ontwikkeling er<strong>voor</strong> dat de omzet van de chip<br />

beperkt is. Ook zoekt men naar verkorting en capaciteit vermindering van design-in projects, zodat<br />

meer klanten in korte tijd geholpen kunnen worden. Toch gaan de herstructureringen van de<br />

software die hiertoe moeten leiden traag, omdat de focus ligt op het verkopen van wat men heeft.<br />

De investering in de software aan het begin van de eeuw, die de basis vormt van de huidige (2008)<br />

software stack is misschien nog niet genoeg terugverdiend.<br />

De eerste digitale televisies waren een succes waarmee Philips een <strong>voor</strong>sprong nam op de<br />

concurrentie: de televisies van de concurrentie bleven in de schappen. Bij de overgang van HDTV<br />

ready naar Full HDTV liet Philips zich verrassen door de concurrentie. We hadden geen<br />

onmiddellijk antwoord en onze televisies bleven onverkocht.<br />

Veel DSP's zijn specialistische digitale signaal processors die werken met een “ingebakken”<br />

programma. Ze delen geen geheugen met de andere processors, en <strong>voor</strong> een nieuw programma is<br />

een speciale loader nodig. Ze gebruiken specialistische i/o devices, bij<strong>voor</strong>beeld speciale AD of DA<br />

converters. Na het “inbakken” is er feitelijk sprake van hardware. In de tv's waarbij ik betrokken<br />

was werden ze bij<strong>voor</strong>beeld gebruikt bij het digitaliseren en decoderen van de oude analoge audio<br />

en video signalen naar het interne formaat. Ze zijn wel onderdeel van de éne televisie chip.<br />

TriMedia's zijn general purpose signaal processors met geheugen waarin steeds opnieuw software<br />

geladen kan worden vanuit de MIPS. Deze flexibiliteit maakt het volgende mogelijk:<br />

Het bewerken van tv signalen behoort tot het competentie gebied van zowel set-makers als chipmakers.<br />

Allebei willen ze software ontwikkelen <strong>voor</strong> signaal bewerking. Dit is software in de<br />

TriMedia laag, “achter”de API (application interface). De samenhang die <strong>voor</strong> deze software<br />

nodig is wordt bereikt met een gemeenschappelijk project van NXP en een belangrijke tv<br />

fabrikant: het design project.<br />

Er is een tendens om de development fase te verwaarlozen en alle wijzigingen te realiseren middels<br />

problem reports. Persoonlijk ben ik daartegen. In mijn beschrijvingen ga ik dan ook uit van<br />

development activiteiten. Halstead gaf een definities <strong>voor</strong> complexiteit, zoals lenght, volume,<br />

difficulty effort en dergelijke. Mijns inziens kun je de complexiteit in een development inspanning<br />

terugdringen, en kan die alleen maar toenemen in de verificatie manier van werken. Zelf ben ik er<br />

<strong>voor</strong>stander van dat systematisch in nieuwe projects een onderdeel van de software opnieuw wordt<br />

gestructureerd. Natuurlijk moet dat wel met design en development activiteiten gebeuren. Je zou dit<br />

kunnen verwoorden door te stellen dat geen line of code ouder mag zijn dan 6 tot 10 jaar.<br />

Overigens, <strong>voor</strong> nieuwe features is development nodig, je kunt doorgaans niet uitgaan van een<br />

“hello world” programma om vandaar uit met problem reports het feature te realiseren.<br />

Waardoor wordt deze tendens om meteen vol de integratie/verificatie fase in te gaan gevoed?<br />

● Met problem reports kunnen programmeurs in paren of alleen, onafhankelijk van de anderen<br />

werken, bij grotere wijzigingen moet er meer worden samengewerkt.<br />

Bij grote wijzigingen bij<strong>voor</strong>beeld, kan de software verdeeld worden over de programmeurs,<br />

die dus ieder hun eigen onderdeel bijhouden. Wijzigingen moeten gesplitst worden, zodat<br />

meerdere specialisten een deel krijgen, die wijzigingen zijn niet zonder meer onafhankelijk<br />

te integreren. Daarentegen bij kleine wijzigingen kunnen de wijzigingen uitgedeeld worden<br />

Pagina: 14 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

aan de programmeurs, die ieder <strong>voor</strong> zich dan alle benodigde software wijzigen, en<br />

onafhankelijk integreren.<br />

● Test-items in de integratie fase testen of software voldoet aan de requirements <strong>voor</strong> het eindresultaat.<br />

Test-items in de development fase testen of een development stadium bereikt is.<br />

Deze test-items kunnen zeer omvangrijk worden, en zijn afhankelijk van <strong>voor</strong>tschrijdende<br />

wijzigingen in het eisen pakket. Testers vinden dat ze wegwerp tests maken, die verder nooit<br />

meer bruikbaar zijn. Als je een ontwikkelingsgang wilt volgen zodanig dat de software in<br />

elk stadium getest kan worden met tests die een uittreksel zijn van tests uit de verificatie<br />

fase, dan vergt dat nogal wat van die ontwikkelingsgang: de software uit het begin moet<br />

compatibel zijn met de uiteindelijke software. Met een test-plan in de integratie fase is een<br />

overzichtelijke <strong>voor</strong>tgang zichtbaar van items die nog niet kunnen worden getest, items die<br />

fout zijn, en items die correct zijn. Fout en correct is ten opzichte van de requirements <strong>voor</strong><br />

het eindproduct. Testers maken in de integratie fase gebruik van herbruikbare tests, want alle<br />

televisies lijken op elkaar.<br />

Een <strong>voor</strong>beeld uit begin jaren negentig van een ontwikkelingsgang die waarschijnlijk niet<br />

volledig de compatibele reeks stadia oplevert die testers waarderen: In een MS-DOS<br />

applicatie gebruik je eerst een interface die gebaseerd is op een tweedimensionale tekst<br />

omgeving (de <strong>voor</strong>lopige, geïmproviseerde oplossing), en later als de functionaliteit bereikt<br />

is ga je over op een grafische interface.<br />

Ooit heb ik geleerd wat een Pert network is, en hoe een Gantt chart eruitziet. Bij de ene staan de<br />

activiteiten in de knooppunten en bij de andere in horizontale balken langs een tijdlijn. Bij beiden<br />

zijn de afhankelijkheden van de activiteiten weergegeven met pijlen. Ik meen mij te herinneren dat<br />

er ooit ook nog een soort geïnverteerde Pert chart was, met de activiteiten in de pijlen en de<br />

afhankelijkheden in de knooppunten, maar in Wikipedia vond ik slechts de opmerking dat dit een<br />

AOA (activity on arrow) schema was. In de vele kleine projects waaraan ik heb deelgenomen (één<br />

tot vier mensen <strong>voor</strong> de software) heb ik serieus geprobeerd volgens zo'n plan te werken, en altijd<br />

bleek weer dat de <strong>voor</strong>af bedachte afhankelijkheid eigenlijk helemaal niet gold. Het was misschien<br />

handig als module A klaar was <strong>voor</strong> B, maar als dat niet zo uitpakte, dan improviseerde je wat, en<br />

kon je B gebruiken of testen zonder A. Hierin lijkt software werkelijk soft te zijn, harde volgorde<br />

doet er eigenlijk niet zoveel toe.<br />

Ik dacht dat het aan mij lag, dat de afhankelijkheden en werk indeling constant veranderden, als het<br />

ging om ontwikkelafhankelijkheden van onderdelen. Ik dacht dat ik mij teveel liet leiden door de<br />

inspiratie en de waan van de dag, in plaats van te werken volgens het plan. Ik dacht dat anderen er<br />

geen last van hadden.<br />

Het testen van televisie software, en zelfs het ontwikkelen ervan is <strong>voor</strong> een groot deel (in ieder<br />

geval het aandeel van NXP op de MIPS) afhankelijk van de hardware (of van de software in de<br />

TriMedia). Ieder die betrokken is bij embedded software ontwikkeling weet dat en voelt dat: je kunt<br />

een driver misschien wel testen zonder hardware, maar dat is niet echt, en heeft niet veel waarde.<br />

Je moet de software testen op de hardware, punt! In de software-werkplaats werken vakmensen die<br />

specificaties leuk vinden, maar liefst zo snel mogelijk willen werken aan de hand van<br />

waarnemingen. Trouwens een GUI applicatie maak en test je ook niet zonder grafische kaart en<br />

window manager, dus zuiver op specificaties.<br />

Toen we de software <strong>voor</strong> de digitale televisies ontwikkelden, hebben we het serieus geprobeerd. We<br />

Pagina: 15 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

creëerden <strong>voor</strong> een driver een “test skeleton” waarin we de driver testen op de aangestuurde<br />

hardware. Iedere driver kreeg zijn eigen skeleton. De hardware, wat die doet is afhankelijk van de<br />

manier waarop hij wordt aangestuurd door de driver, en van het signaal dat hij verwerkt. Als je<br />

software test, kijk of luister je onder anderen naar wat de hardware component met het signaal<br />

doet, gegeven de manier waarop je hem aanstuurt. Het signaal komt van een input bij<strong>voor</strong>beeld een<br />

antenne en eindigt in een output, bij<strong>voor</strong>beeld een scherm, en passeert een aantal hardware en<br />

TriMedia componenten. De manier waarop de belendende componenten moesten worden ingesteld,<br />

dat bleek niet erg stabiel te zijn. Voordat je een bestaand skeleton kon gebruiken moest je het eerst<br />

aanpassen aan de laatste toestand van de software. Naarmate de tijd vorderde kon je meer verfijnd<br />

testen van meer input pluggen, naar meer outputs, en met meer nuances in de signalen, en moest je<br />

je test-doelen bijstellen. Skeletons bevatten gedurende langere tijd geïmproviseerde software van<br />

belendende componenten.<br />

Later zijn deze skeletons afgeschaft. Nu wordt uitsluitend getest met “het product” of met een<br />

“platform harness”. Dit harness wordt ook gebruikt als een specifieke driver moet worden getest.<br />

Maar dat van die verfijning en uitbreiding, naarmate de tijd <strong>voor</strong>tschrijdt, dat is gebleven, en<br />

beïnvloedt de testscripts.<br />

Ik merkte dat ik niet alleen was. Het is dus niet: “Ik dacht dat anderen er geen last van hadden ”<br />

maar: “Wij denken dat de anderen er geen last van hebben”.<br />

“Waarom zijn design-in projects nodig? Kan dit niet opgelost worden met configuratie bestanden en<br />

hardware herkenning?”<br />

● Nu in de eerste plaats is een televisie van zo'n design-in project een unieke gelegenheid om<br />

de combinatie van software met de bijbehorende configuratie file en de bijbehorende<br />

hardware te testen. Deze gelegenheid was er niet eerder, want de televisie was nog niet<br />

ontworpen of gemaakt. Het testen van de software van een TV heeft al een doorlooptijd van<br />

een aantal weken. De fouten die er uit komen moeten dan nog opgelost worden, waarna de<br />

tests opnieuw moeten worden uitgevoerd. Het is bekend dat de introductie van software in<br />

en nieuwe gebruikersgroep begint met de ontdekking van een aantal problemen en fouten.<br />

Dit geldt blijkbaar ook <strong>voor</strong> de introductie van software in een nieuwe televisie. Ik meen dat<br />

dit wel eens verwoord is als volgt: hoe meer gebruikers er zijn hoe meer fouten er worden<br />

gevonden. Waarschijnlijk geldt dit meer algemeen <strong>voor</strong> omgevingen waarin software moet<br />

functioneren, en hoeven meer omgevingen niet per se meer gebruikers te zijn.<br />

● In de tweede plaats is het ontwerpen van een televisie of een televisie lijn een creatief proces<br />

waarmee men vriend en vijand probeert te verrassen. Als er alleen een configuratie bestand<br />

moet worden gemaakt, omdat de diversity adequaat is dan is in feite het verrassen mislukt:<br />

de configuratie was min of meer <strong>voor</strong>zien. Dat is niet de bedoeling.<br />

● Tenslotte is het zo, dat de 'universele” one chip TV die door NXP gemaakt is niet altijd<br />

rekening houdt met de specifieke eisen van een door een klant te maken TV set, ook al was<br />

bekend dat de specifieke eisen er waren. Integratie van de chip in zo'n set is dan niet triviaal,<br />

maar mogelijk wel de beste manier om de set te maken. Dus een design-in project is nodig.<br />

Het projectmatig samenwerken betekent dat het ideaal van component software, zoals aangegeven<br />

door Clemens Szyperski in het boek “Component Software” niet bereikt is: er is geen volledig<br />

“Independent Deployment”.<br />

In de tijd dat ik bij NXP werkte was het geen usance om eindgebruikers een upgrade van de<br />

Pagina: 16 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

software te sturen. Als de televisie op de markt kwam dan moest de software klaar en goed zijn. Een<br />

upgrade was in feite een nederlaag. Naarmate “independent deployment” zijn intrede doet zal een<br />

eindgebruiker merken dat upgrades normaal worden: het op de markt komen van een tv betekent<br />

niet langer dat deze uit ontwikkeld is, althans op software niveau kunnen componenten worden<br />

opgevolgd door andere.<br />

Voor set makers betekent dit dat nieuwe software ontwikkelingen niet langer alles bepalend zijn<br />

<strong>voor</strong> de time to market van een televisie: men kan de tv leveren met bestaande software, en later<br />

upgrades sturen. Voor de software ontwikkeling betekent dit dat men rekening moet houden met<br />

adaptive maintenance van alle software in alle design-in (inmiddels maintenance) projects. Het<br />

aantal design-in projects dat tegelijk onderhanden is zal in zo'n situatie drastisch toenemen. Om een<br />

en ander met dezelfde mensen te realiseren zal de software die ontwikkeld en getest wordt aan de<br />

hand van algemeen geldende specificaties moeten toenemen, en de software die specifiek is <strong>voor</strong><br />

een bepaalde hardware en daarop getest moet worden, die software en de tests ervan zullen beter<br />

afgebakend moeten worden. Een subproject dat een package ontwikkelt moet dit dus kunnen doen<br />

<strong>voor</strong> meerdere televisies dus <strong>voor</strong> meerdere master projects.<br />

Voor NXP geldt bovendien dat zijn software ontdaan moet worden van klant specifieke oplossingen.<br />

Met digitale televisie werd begonnen –, samen met Philips CE –, nog <strong>voor</strong>dat al die afbakeningen<br />

definitief en hard waren gespecificeerd.<br />

Waarschijnlijk maakt dat de samenwerkingsprojecten uit die tijd toch wat uniek. Voor tv software<br />

programmeurs bij set-makers is het toch een beetje een cultuur omslag als er bijna uitsluitend tegen<br />

specificaties getest en ontwikkeld moet worden, zonder de hardware zeg maar, want die leidt dan<br />

maar af. Maar <strong>voor</strong> het NXP aandeel geldt dat NXP zich juist terugtrekt op de hardware software<br />

interface.<br />

“Component Software. Beyond Object-Oriented Programming” Clemens Szyperski (ACM / Addison<br />

Wesley: ISBN 0-201-17888-5).<br />

Televisie mensen zijn gewend aan systemen met een “kloppend hart”. Een televisie is onderworpen<br />

aan het strenge regime van 50 of 60 beelden per seconde. Een beeld moet volmaakt op het scherm<br />

staan <strong>voor</strong>dat het volgende beeld aan de beurt is, anders krijg je “macro blokken” of andere<br />

storingen. Zo richten ze ook hun projects in: dagelijks wordt de software bijgehouden, periodiek<br />

(wekelijks, 2 wekelijks, maandelijks afhankelijk van de project-fase en het project) komt er een<br />

nieuwe baseline. Hun projects kenmerken zich door een “kloppend hart”. Dit creëert dagelijkse en<br />

periodieke deadlines waarin de dingen moeten gebeuren. Veel handelingen zijn tijdrovend, en<br />

worden onder tijdsdruk wel eens achterwege gelaten, hierin zijn televisie mensen minder strikt in<br />

hun projects dan in hun tv's.<br />

“Waarom wordt er eigenlijk zoveel <strong>voor</strong>tgang ge<strong>control</strong>eerd? Blijkbaar gaat men er van uit dat je<br />

als manager kunt ingrijpen bij vertragingen, maar kan dat wel? Er geldt toch de regel dat meer<br />

mensen op een te laat project de zaak alleen maar meer vertragen?”<br />

De meeste <strong>voor</strong>tgangsproblemen hebben geen crisisachtig karakter en worden opgelost doordat<br />

teamleden elkaar helpen, onderling het werk herverdelen, en (nog) wat meer uren maken. Ook kan<br />

men binnen een team vrij probleemloos met capaciteiten schuiven van het éne project naar het<br />

andere.<br />

Behalve dat hij wel heel erg een eigen leven is gaan leiden, en iedereen er meteen naar wijst als het<br />

management ingrijpt, is er nog iets grappigs aan die oude wet (in 1975 gepubliceerd geloof ik). Om<br />

hem te <strong>control</strong>eren zou het project zich moeten splitsen in een project dat op de oude manier<br />

doormoddert, en een project waar nieuw bloed leidt tot herbezinning (dat kost tijd) en misschien tot<br />

Pagina: 17 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

nieuw elan (dat spaart tijd, mits het lukt). Het enige wat je kunt meten is één van de <strong>voor</strong>tgangen,<br />

want andere hebben zich niet <strong>voor</strong>gedaan. Of de wet in een specifieke situatie mag worden<br />

overtreden is mogelijk een kwestie van geloof, inzicht en ervaring.<br />

In ieder geval zijn de eerder genoemde factotums en goeroes enkele malen met succes ingezet in<br />

crisisachtige situaties. Het motto van de leiding was: “be prepared”. Ze waren erop <strong>voor</strong>bereid dat<br />

plannen kunnen mislukken, en dat bleek sterker dan de wet van Brooks. Eigenlijk is het natuurlijk<br />

ook de aard van het bedrijf en het product waardoor de wet niet per se geldt, en mensen<br />

gemakkelijk kunnen verhuizen van het éne project naar het andere, en van het ene team naar het<br />

andere, al is het nooit helemaal naadloos.<br />

Let wel: bij het toevoegen van een factotum aan een project gaat het primair om de extra<br />

“man-months”, dus het is een echte lange neus tegen de wet. Er lopen dan extra mensen in paren of<br />

individueel in de tredmolen: problem report van de stapel halen, fout analyseren en verbeteren,<br />

testen, regressie test uitvoeren, inchecken, problem report van de stapel halen, ... Je helpt elkaar<br />

waar nodig, maar dat neemt niet excessief toe met nog meer mensen. Behalve de eerste paar dagen,<br />

waarin de ervaren nieuwkomers worden bijgepraat, gaat alles zijn gewone gang. Zelfs minder<br />

ervaren mensen zijn wel eens ingezet, onder leiding van de project architect, en met de afspraak dat<br />

ze <strong>voor</strong>al steun zouden zoeken bij elkaar, en dat ze <strong>voor</strong>al werk van de stapel zouden halen dat tot<br />

hun specialiteiten behoort. Of ze de project-duur significant hebben verkort is mij niet bekend,<br />

hoogstwaarschijnlijk hebben ze de duur niet verlengd. Qua methode: “baat het niet, het schaadt ook<br />

niet”. Dat geldt in ieder geval <strong>voor</strong> de doorlooptijd.<br />

Er zijn veel boeken over team building, en ook over crisis management, en ik heb ooit heel vroeger<br />

een enkele gelezen. Eigenlijk weet ik niet echt hoe je een team bemant en de menselijke<br />

samenstelling onderhoudt, of hoe je professioneel ingrijpt als zich een crisis <strong>voor</strong>doet. De boeken<br />

waarvan ik mij nog maar nauwelijks de details herinner:<br />

“The Mythical Man-Month”. Frederick P. Brooks, Jr. (Addison-Wesley: ISBN 0-201-00650-2))<br />

“The Psychology of Computer Programming”. Gerald M. Weinberg (Dorset House Publishing:<br />

ISBN: 0-932633-42-0 384)<br />

Soms moet je als manager wel ingrijpen.<br />

Zelf ben ik samen met een collega medio jaren tachtig wel eens ingezet in een klein te laat project,<br />

als software reviewer van software die geschreven was in een mij onbekende script taal. Het ging<br />

meen ik om een implementatie van een EDI systeem betreffende de goederen stroom (orders,<br />

leveringen, facturen en dergelijke). Het betrof een in-house project van TASS <strong>voor</strong> het rekencentrum<br />

van Philips in Eindhoven.<br />

Het IBM mainframe waarop getest moest worden was pas laat beschikbaar gekomen, waardoor er<br />

een soort big bang situatie was ontstaan: alle software werd geïntegreerd getest. Toen mijn collega<br />

en ik begonnen was testen zelfs compleet onmogelijk. Vandaar dat we werden ingezet als reviewer<br />

en vandaar dat het team er nogal moedeloos uitzag.<br />

Eén fout is ontdekt door iemand die zijn software nakeek om een vraag van mij te beantwoorden<br />

toen ik mij inwerkte, sommige fouten vond men zonder onze inbreng, andere met een van ons als<br />

praatpaal, en een enkele fout vonden we zelfstandig als reviewers. Na een week of twee hadden we<br />

met elkaar de spook-verschijnselen in de software verklaard en verbeterd, en toen was het project<br />

ook zo goed als klaar.<br />

Uitspraak achteraf van de staf: “Brook's vuistregel is er om overtreden te worden, maar liefst wel<br />

Pagina: 18 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.2 De organisatie<br />

intelligent”.<br />

OK, ik zal wat meer details geven. De meeste fouten waren peanuts. Er was maar één systematische<br />

fout verantwoordelijk <strong>voor</strong> de spook-effecten die testen onmogelijk maakten. Deze fout kon<br />

woekeren omdat er tijdenlang geen mainframe beschikbaar was <strong>voor</strong> testen, en misschien ook<br />

omdat het team bij TASS zat, en niemand van de klant over een schouder meekeek.<br />

De teamleden hadden het taaltje geleerd van <strong>voor</strong>beelden, van elkaar, en van iemand bij de klant,<br />

waar de taal inmiddels een beetje ingeburgerd was. De scripttaal en de interpreter waren nogal in<br />

elkaar geflanst. Een procedure call was geïmplementeerd zonder call stack: er werd maar één<br />

return adres onthouden. Bij elke call opdracht, en alleen bij elke call opdracht, werd het returnadres<br />

register bijgewerkt en bij elke return opdracht vond een goto plaats naar het onthouden<br />

adres. Wie denkt nou aan zoiets als je van huis uit C of Pascal programmeur bent op een VAX/VMS<br />

systeem of op een Unix mini: de Philips P800.<br />

De systeembeheerders, werk<strong>voor</strong>bereiders en operators in het rekencentrum waren gewend aan<br />

JCL, aan allerlei hen opgedrongen configuratie files, en aan de ongein die applicatie<br />

programmeurs op de laatste project dag nog even <strong>voor</strong> ze uitvinden, zoals de beruchte datum<br />

ponskaart. (Nou ben ik behoorlijk aan het chargeren, dat gebeurt lang niet altijd.) Ze vonden zo'n<br />

regel of interpreter niets bijzonders, en het ontbreken van validatie heel normaal. Deze catastrofe<br />

had de klant niet kunnen <strong>voor</strong>zien.<br />

Ik moest of wilde mij inwerken zonder het team teveel te belasten, dus ik leerde het taaltje uit een<br />

boekje en geloofde mijn ogen niet toen ik las dat je binnen een subprocedure geen procedure call<br />

mocht uitvoeren. Zo was ik, denk ik, de eerste die de fout-oorzaak ontdekte.<br />

Dus ik wist: “je moet wel wat geluk hebben, een ander was je zomaar vóór geweest”.<br />

Achteraf gezien was het misschien niet zo rationeel, om je in te werken zonder het team te belasten.<br />

Iemand inwerken heeft immers op zich al een hoog review gehalte. Ook hiermee hebben we<br />

mogelijk geluk gehad, al had ik mij laten ringeloren door de wet van Brooks.<br />

In onze presentatie als reviewer toonden we aan dat de verschijnselen bij het testen het gevolg<br />

waren van de diepte structuur en de call beperking. Spokerij werd vervangen door logica, en het<br />

gedrag van de software kon tenslotte door iedereen worden nagespeeld en begrepen. Maar ook was<br />

onontkoombaar duidelijk dat de fundamentele structuur van de software vervangen moest worden.<br />

Dat bleek <strong>voor</strong> ieder bijzonder moeilijk te accepteren: het was verder een goed doordacht concept.<br />

De volgende dag, nadat ze een vlak gestructureerd framework hadden geadopteerd, en de taken om<br />

het frame in te vullen waren verdeeld, zaten ze weer neuriënd achter hun CRT scherm. Alleen de<br />

teamleider, die de oorspronkelijke opzet had bedacht, was nog lange tijd van slag, maar hij heeft<br />

zich, als ik het mij goed herinner, niet ziek gemeld.<br />

Vanwege dat acceptatie probleem en vanwege hun moedeloosheid geldt mogelijk: “Misschien<br />

waren ze er niet uitgekomen zonder nieuwe medewerkers in het team”, en had ik helemaal geen<br />

geluk gehad. Misschien maar goed dat de staf niet naar de wet had geluisterd.<br />

Pagina: 19 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.3 De televisie als bedrijf<br />

1.3 De televisie als bedrijf<br />

Als je de televisie ontleedt, hetzij hardware hetzij software, dan vind je een componenten structuur.<br />

Toch herken je vaak nog een bedrijfsmodel. Er is een transformatie laag, een besturing en planning<br />

laag, en een laag waarin doelen geformuleerd worden (door de zapper). Het is natuurlijk wel een<br />

simpel model zonder een strategische component, zonder verander processen, zonder projects, en<br />

zonder informele gegevens.<br />

In de hardware zie je de TriMedia, en de DSP's die zich bezig houden met het transformatie proces,<br />

en de MIPS die <strong>voor</strong>al gebruikt wordt <strong>voor</strong> besturing en planning, en met een beetje goede wil zou<br />

je de stand-by processor, die onder meer belast is met het ontvangen van de signalen van de<br />

afstandsbediening, kunnen zien als de component die zich bezighoudt met de doelen. Dit laatste is<br />

een grapje, de stand-by processor heeft nog enkele simpele ad converters, beheert een aantal aan/uit<br />

poorten, (sommige van deze poorten worden gebruikt als input andere als output, soms als<br />

input/output), en bevat een wekker, hij is <strong>voor</strong>namelijk een ondersteunende afdeling, Het ontvangen<br />

opslaan en bijhouden van de bedoelingen van de zapper is een taak van de MIPS software.<br />

In de software is herkenbaar de software die zich bezig houdt met het transformatie proces. Dit is<br />

altijd TriMedia software, De besturing en planning software zelf is gesplitst in middleware en de<br />

drivers (AV platform laag). De driver laag draait deels op de MIPS, maar sommige hardware<br />

componenten worden bestuurd vanuit de TriMedia. Er is nog ondersteunende software: os<br />

(operating system), een API laag tussen TV software en het onderliggende operating kernel. En er<br />

zijn de applicaties. Op de MIPS was de kernel vroeger een gespecialiseerde real time kernel, maar<br />

tegenwoordig is dit Linux. De TriMedia gebruikt nog wel een specifieke real time kernel.<br />

Planning en besturing maakt gebruik van gegevens die door de zapper of door applicaties zijn<br />

verstrekt, van configuratie gegevens, van gegevens die door dealers wordt verstrekt (bij<strong>voor</strong>beeld<br />

geografische informatie) en van gegevens die afkomstig zijn van de te verwerken signalen. Deze<br />

laatste categorie gegevens kunnen een real time probleem geven als ze afgehandeld moeten worden<br />

door de MIPS software.<br />

Een <strong>voor</strong>beeld hiervan is de aanwezig/afwezigheid detectie van een signaal. Bij afwezigheid moet<br />

meestal geen ruis maar een blanco scherm gepresenteerd worden. Als de bestuurder moet beslissen<br />

dan zie je even ruis op het scherm, en als dit autonoom wordt afgehandeld dan zie je geen ruis. Er is<br />

een enkel geval waarin het tonen van ruis functioneel wordt geacht, dan wordt niet gedelegeerd, in<br />

alle andere gevallen wordt wel gedelegeerd.<br />

Een ander <strong>voor</strong>beeld is “fast blanking” Een video recorder stuurt via een scart plug een CVBS<br />

signaal naar de TV, maar als de gebruiker de video recorder instelt dan wordt gebruik gemaakt van<br />

de TV <strong>voor</strong> de menu's van de video recorder (OSD: on screen display), en wordt niet alleen het<br />

CVBS signaal gestuurd maar ook een RGB signaal met het menu. Beide signalen beslaan in<br />

principe het hele scherm. Er wordt een aan/uit signaal – “fast blanking” genaamd – meegestuurd om<br />

aan te geven waar in het RGB signaal het menu staat. De besturing software is te traag om de<br />

overgang te realiseren, terwijl de transformatie laag enkele pixels nodig heeft om te schakelen,<br />

nadat de recorder de wenselijkheid van de overgang heeft gerapporteerd. Daarom kan de<br />

transformatie laag deze CVBS/RGB v.v. overgang autonoom afhandelen. Er is echter ook hardware<br />

waarin deze faciliteit ontbreekt, en dan wordt de overgang alsnog door de besturingssoftware<br />

beslist. Maar nu kost een dergelijke overgang enkele frames, in plaats van één pixel. Als de zapper<br />

Pagina: 20 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.3 De televisie als bedrijf<br />

een tv station kiest dan wordt fast blanking niet toegestaan, maar als naar de scart van een video<br />

recorder of dvd speler wordt gezapt dan wordt fast blanking gedelegeerd.<br />

Bij nieuwe hardware (of TriMedia software) kan<br />

de software engineer verrast worden door<br />

faciliteiten die opeens autonoom kunnen worden<br />

afgehandeld, of door faciliteiten die dat opeens<br />

niet meer kunnen. Iemand die UHAPI bestudeert<br />

zal zich soms misschien wel eens afvragen<br />

waarom bepaalde dingen autonoom afgehandeld<br />

kunnen worden door de transformatie laag.<br />

Meestal is er een goede reden. Daarna kun je je<br />

dan afvragen waarom er een mogelijkheid<br />

geboden wordt om dingen niet autonoom te laten<br />

afhandelen, en waarom zo'n functie soms<br />

ontbreekt in de transformatie laag.<br />

UHAPI: Universal Home API. Dit is een interface<br />

verzameling die gedefinieerd wordt door het<br />

UHAPI forum. Meer details zijn te vinden via<br />

Wikipedia (Engels) UHAPI.<br />

Met de komst van de digitale televisie komt er<br />

meer nadruk op te liggen op de tv als een<br />

verzameling applicaties. We hadden reeds een<br />

menu structuur, teletekst, een automatische<br />

programmagids, misschien een faciliteit <strong>voor</strong><br />

automatisch opnemen, en dergelijke. Met de<br />

komst van digitale tv komt er ook interactieve tv:<br />

MHEG en MHP. Daarnaast zijn er multimedia en<br />

internet toepassingen, variërend van fotoalbum,<br />

tot beeldtelefoon, al dan niet volgens de DLNA<br />

standaards. Er zijn nieuwe methoden van<br />

copyright bescherming zoals DHCP, er zijn<br />

Fast blanking<br />

methoden van pay-tv met behulp van een CI<br />

(common interface). PIP, menu's en teletekst zijn<br />

uitgegroeid en behoeven een volwaardige window manager, gefaciliteerd door een sophisticated<br />

scaler/mixer. Het pure streaming transformatie systeem wordt een steeds kleiner deel van de<br />

televisie. Naast het “bedrijf” bevat de televisie zo ook een aantal “klanten” van het bedrijf: de<br />

applicaties.<br />

De besturing van het audio video platform vindt uiteindelijk plaats door registers te zetten, en<br />

registers te lezen. Er is een centrale database waarin <strong>voor</strong> veel situaties de register standen staan. De<br />

beheer software gaat uit van een aantal standaard instellingen,en weet wat de afwijking is van de<br />

standaard en bepaalt daarmee de register inhoud. Bij<strong>voor</strong>beeld, stel er zijn 2 ingangen <strong>voor</strong> analoog<br />

geluid. Via enige analoge elektronica bereikt dit signaal de omzetter naar een digitaal signaal. De<br />

analoge componenten hebben eigenschappen binnen toleranties. Als een tv gemaakt wordt, en<br />

mogelijk naderhand tijdens onderhoud, wordt door metingen vastgesteld wat de afwijking is van<br />

Pagina: 21 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.3 De televisie als bedrijf<br />

een norm. Dat wordt gecompenseerd met afwijkende register waarden. Een gebruiker die het<br />

geluidsvolume bijstelt vindt dat dat lineair gebeurt, maar de expert weet hoe de register settings<br />

moeten worden bijgesteld, gegeven de afwijkingen van de elektronica. Tuning is ook nodig om<br />

ontwerp karakteristieken te compenseren, zodat een analoog of digitaal signaal hetzelfde overkomt,<br />

of het nu van de tuner, MPEG speler, HDMI of scart afkomt, en hoe het bewerkingstraject er ook<br />

uitziet. Het vindt plaats op alle ins en outs. Tuning vindt plaats door berekening, meten in de test en<br />

integratie fase en <strong>voor</strong> de toleranties tijdens de fabricage of tijdens onderhoud.<br />

Om optimale beeld kwaliteit te waarborgen moet er regelmatig bijgestuurd worden. De stuurmanskunst<br />

is onderdeel van de platform besturing. Het bijsturen hoeft niet slechts te zijn gebaseerd op<br />

metingen van de signalen. Temperatuur metingen in de televisie, en het meten van licht en geluid in<br />

de omgeving is ook mogelijk.<br />

Het connection management, dat reageert op zappen en signalen die wegvallen, of die juist<br />

beginnen, regelt het opzetten van signaal routes.<br />

Een deel van het power management: het planmatig aanschakelen en uitschakelen van een televisie<br />

is <strong>voor</strong> een deel de platform besturing.<br />

Schematisch overzicht van het transformatie proces: een typisch Europese televisie<br />

Opmerkingen bij “Schematisch overzicht van het transformatie proces: Europese televisie”:<br />

Pagina: 22 / 230<br />

● De switches zijn gemerkt met een “X” het zijn “source selection switches”.<br />

Een output pin is altijd verbonden met hoogstens één input pin, een input<br />

pin kan verbonden zijn met meerdere output pinnen. De kolommen met een


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.3 De televisie als bedrijf<br />

X representeren in feite een groep matrices, waarin afzonderlijk schakelbare output pinnen<br />

zitten. In één matrix kan iedere output pin worden verbonden met iedere input pin, maar niet<br />

met twee input pinnen tegelijk.<br />

● From file: de file is geselecteerd in het “connectivity system” en komt van het<br />

internet/intranet, van een USB-stick soms zelfs van een interne harddisk.<br />

● Sources die verbonden zijn middels scart zijn “statisch” geclusterd, maar sommige AV<br />

sources zijn “dynamisch” geclusterd (verbonden met diverse pluggen aan de achterkant van<br />

de tv).Het betreft dan soms een combinatie van YPbPr (3 pluggen type RCA), CVBS (1 plug<br />

type RCA), YC (1 plug type S-Video) LR (2 pluggen RCA), SPDIF (1 plug type FOSLINK ),<br />

maar ook combinaties met DVI en HDMI zijn mogelijk. Een source is bij<strong>voor</strong>beeld een DVD<br />

speler. De verzameling tv pluggen waarmee de dvd speler is verbonden vormen een input<br />

cluster die gezamenlijk de DVD speler representeren. Dit is vaak een dynamisch cluster, de<br />

samenstelling van de pluggen is niet <strong>voor</strong>geprogrammeerd.<br />

● Een enkele source kan “inbreken” als het betreffende apparaat gaat spelen, en<br />

interrumpeert de main source. Het daar<strong>voor</strong> benodigde signaal wordt door de tv<br />

gemonitord. Als het apparaat aanstaat dan toont de source een logo als je er naar zapt. Dit<br />

is meestal geen reden <strong>voor</strong> break-in. Het apparaat moet echt gaan spelen.<br />

● Sommige source clusters kunnen meerdere versies van een signaal tegelijkertijd aanbieden.<br />

Vaak wordt in zo'n situatie automatisch het digitale signaal of het signaal met de grootste<br />

bandbreedte (het minst gecomprimeerde signaal) geselecteerd. De niet geselecteerde<br />

signaal routes moeten dan vanaf source tot aan “signal selection” intact zijn zodat de<br />

aanwezigheid van het signaal gemonitord kan worden, dit moet in ieder geval gebeuren<br />

<strong>voor</strong> de route van het <strong>voor</strong>keur signaal.<br />

● Sommige sources kunnen successievelijk (achtereenvolgend) meerdere soorten signaal<br />

aanbieden, op dezelfde pluggen. Dan wordt automatisch het juiste pad gekozen na een<br />

verandering.<br />

● Een club is in feite een groepje destinations die gezamenlijk naar dezelfde source kijkt en<br />

luistert. Het is geen gangbaar begrip in televisieland, maar het is evident dat clubs bestaan.<br />

● Encrypted canal plus club. Het “encrypted canal plus” signaal komt uit de tuner, en gaat<br />

naar Scart1 (destination) en zo naar de canal plus decrypt box. De “main” club kijkt en<br />

luistert ondertussen naar Scart1 (source) naar de audio en video signalen die uit de decrypt<br />

box komen.<br />

● In feite is de “encrypted canal plus” route open als de tuner staat ingesteld op een analoog<br />

station, dus ook bij niet versleutelde signalen.<br />

● Subwoofer club. Het Spdif output signaal komt uit de “main” club en gaat naar de homecinema<br />

audio set. Het subwoofer signaal komt uit de home-cinema audio set. De speakers<br />

van de tv vormen in deze schakeling de “subwoofer” van het surround audio systeem. Het<br />

lipsynchroon probleem van digitale tv's wordt door de tv opgelost: het Spdif output signaal<br />

is lipsynchroon met de video. Van de home cinema set en de subwoofer club wordt verder<br />

geen significante doorlooptijd verwacht.<br />

● De encrypted canal plus club, en de subwoofer club hoeven feitelijk geen source te kiezen.<br />

Voor die clubs ligt de source vast.<br />

● Naar de main club kunnen schakelen: Main window, Speakers, Headphones, Scart, Spdif,<br />

LR sound.<br />

● Naar de PIP club kunnen schakelen: PIP window, Speakers, Headphones, Scart, Spdif, LR<br />

sound. Wat ik PIP (picture in picture) genoemd heb kan ook een gelijkwaardig “second<br />

Pagina: 23 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.3 De televisie als bedrijf<br />

window” in een “dual window” televisie zijn.<br />

● PIP window en Main window kunnen niet echt schakelen naar een club, het zijn vaste<br />

clubleden van hun eigen club.<br />

● Naar “Sound only” kunnen schakelen: Speakers, Headphones, Spdif, LR sound. Sound kan<br />

in principe uit elk der sources komen. Merk op: scart output doet niet mee, maar produceert<br />

geluid, dat hoort bij de betreffende video (uit de main, pip, of canal plus club).<br />

● Video route selecties zijn chip en software afhankelijk. Een <strong>voor</strong>beeld van signalen die ieder<br />

een eigen route volgen:<br />

gewone video (1FH in het jargon)<br />

HD ready (2FH)<br />

Full HD (3FH)<br />

PC monitor, Game: deze moeten zonder vertraging, dus nogal onbewerkt getoond<br />

worden.<br />

● Een van de vele <strong>voor</strong>beelden waar het schema niet exact opgaat:<br />

Voor Scart output kun je kiezen of een CVBS signaal wordt geleverd of een Y/C signaal.<br />

Maar deze keuze is er niet als het signaal afkomstig is uit de “encrypted canal plus club”,<br />

dan wordt altijd het CVBS signaal geleverd:<br />

Met nog meer details ziet het schema er nog weer anders uit. Pin 19 van de scart ontvangt<br />

of het CVBS of het Y (luminance) signaal. Het C (chrominance) signaal komt wel of niet op<br />

pin 15: dat werkt niet met een “input selection switch”, maar een “open/close switch”.<br />

Toen er uitsluitend zwart/wit tv's waren was er slechts het luminance signaal. Met de komst<br />

van kleuren tv's werd CVBS geconstrueerd zodanig dat CVBS onbewerkt te gebruiken is als<br />

luminance signaal in zwart/wit tv's. Het verschil tussen CVBS en Y/C output is vaak<br />

uitsluitend het “bij”schakelen van het aparte chrominance signaal, omdat CVBS gebruikt<br />

kan worden als het luminance signaal.<br />

Het bandbreedte <strong>voor</strong>deel van het Y/C signaal wordt natuurlijk niet geëffectueerd, als de<br />

source een CVBS bron is: het signaal wordt niet beter dan het is.<br />

● Mixing <strong>voor</strong> speakers en headphones: per afzonderlijke speaker kan er sprake zijn van<br />

equalizing en mixing van de oorspronkelijke (mono, stereo, surround) audio-stromen.<br />

Featuring en encoding gaan daarbij hand in hand. We beschouwen de DAC (digital to<br />

analog conversion) als encoding, de rest als featuring.<br />

Pagina: 24 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

1.4 Televisie, de software<br />

Ik heb <strong>voor</strong>namelijk met Philips Consumer Electronics samengewerkt. Zowel NXP als Philips CE<br />

gebruiken de taal C als programmeertaal. Toen ze samen een digitale TV gingen maken bleek dat<br />

wel zo ongeveer de enige overeenkomst.<br />

1.4.1 Architectuur en component modellen<br />

Toen Philips Consumer Electronics en Philips Semiconductors gingen samenwerken om een<br />

digitale televisie te maken was de situatie als volgt:<br />

De software architectuur van CE wordt MG-R genoemd. Deze naam is afgeleid van het MG98<br />

project waarin <strong>voor</strong> het eerst een component model werd gebruikt in een Philips televisie. MG-R<br />

betekent MG-Revised. De Software stack van CE gebruikt al sinds MG98 uit de vorige eeuw Koala<br />

<strong>voor</strong> de indeling van software in “compile time” componenten, die met elkaar communiceren<br />

middels Koala interfaces. (documentatie is te vinden met Google: trefwoord “Koala<br />

Component”).<br />

Recente documentatie over Koala vond ik niet. Er is: “The Koala Component Model for Consumer<br />

Electronics Software”, Rob van Ommering, Frank van der Linden, Jeff Kramer, Jeff Magee; IEEE<br />

Computer, March 2000, p78-85. Er is een website waar een opensource versie wordt aangeboden.<br />

XT / Koala compiler. Zelf heb ik thuis stiekem het manual "The Koala Yellow pages", waarin de<br />

volgende zin staat: "The Koala pages have been written in July 1997. They have been updated in<br />

October 2000, October 2001 and September 2002."<br />

Koala compileert cd, dd, id, en pd files, en genereert een h file per Koala module. Soms genereert<br />

Koala ook c files, namelijk als <strong>voor</strong> de betreffende Koala module niet met de hand een c file is<br />

gemaakt waarin interface functies worden geïmplementeerd. Koala gebruikt een database waarin<br />

wijzigingen kunnen worden aangebracht. In een clean build wordt een nieuwe database gemaakt. In<br />

vervolg builds worden wijzigingen in de source files gebruikt om de database te wijzigen<br />

Gewijzigde input files resulteren in een gewijzigde database en van daaruit in gewijzigde h files en<br />

c files. De betreffende folder bevat na afloop van een Koala build niets anders dan de huidige h en c<br />

files. Hierdoor is duidelijk welke object files kunnen vervallen, welke blijven welke nieuw of<br />

opnieuw gemaakt moeten worden. Wijzigingen in een c file in de source tree, die ongeveer dezelfde<br />

naam heeft als de overeenkomstige h files, en die deze inlijft, bepaalt mede welke object files<br />

wegens wijzigingen opnieuw moeten worden gemaakt. De lijst met objects in de object folder<br />

bepaalt de nieuwe inhoud van de executable. Het merendeel van build: <strong>control</strong>e op gewijzigde cd,<br />

dd, id, en pd files, worden behandeld door Koala. Wat overblijft <strong>voor</strong> make is redelijk simpel en<br />

recht toe recht aan.<br />

NXP noemde haar architectuur DVP (digital video processing). De software van NXP (<strong>voor</strong>heen<br />

Philips Semiconductors) <strong>voor</strong> de TriMedia gebruikt <strong>voor</strong>namelijk IDL interfaces en “COM”<br />

methoden <strong>voor</strong> de RPC communicatie met de MIPS. De COM methode <strong>voor</strong>ziet niet in het<br />

genereren van make files. Er werd gebruik gemaakt van recursive make.<br />

De COM methode maakt gebruik van de midl compiler. Deze compiler compileert idl files. Hij<br />

maakt er proxy/stub programmatuur en h files van. Proxy is het marshaling deel aan de client zijde<br />

en stub het marshaling deel aan de server zijde. Ik herinner mij dat de bij een interfaces of een<br />

component benodigde GUID (global unique identifier) in een c file wordt geplaatst. Dit laatste<br />

Pagina: 25 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

dient om te <strong>control</strong>eren of de versies van componenten en interfaces die verondersteld worden in<br />

client software, of die versies aanwezig zijn, of bediend worden in de server software. Ook wordt de<br />

midl compiler gebruikt om een registry samen te stellen. UHAPI interfaces worden met behulp van<br />

RPC doorgegeven aan de TriMedia, en aan de drivers van de DSP's.<br />

COM wordt gebruikt zonder ActiveX of tekst interfaces <strong>voor</strong> script talen. Zie Wikipedia, en<br />

Google. Trefwoorden “Microsoft COM”, “midl compiler” en zo.<br />

De architectuur van de geïntegreerde MG-R/DVP software wordt NHSW genoemd: Nexperia Home<br />

SoftWare. He betreffende gedachtegoed wordt beheerd door NXP. Sindsdien begint CE meer en<br />

meer een eigen koers te varen met haar deel van de software stack. De NHSW architectuur ligt vast<br />

in een “architectural notes” document vol met regels en regeltjes <strong>voor</strong> ontwerpen, coderen, opslaan,<br />

structureren, gebruikte tools enzo<strong>voor</strong>t.<br />

Toen ze gingen samenwerken is afgesproken dat de software <strong>voor</strong> de MIPS zou worden gebaseerd<br />

op Koala, en de software <strong>voor</strong> de TriMedia zou worden gebaseerd op COM, maar met een Koala<br />

sausje. Verder zou men op weg gaan om de interfaces naar de driver laag te gaan baseren op COM<br />

(IDL) interfaces. Voor Philips Semiconductors was dit een must, omdat veel van zijn klanten geen<br />

Koala gebruiken. Dit heeft geresulteerd in de Philips standaard NHAPI die inmiddels is opgevolgd<br />

door de algemene standaard UHAPI. Omdat de drivers gedeeltelijk op de MIPS zijn<br />

geïmplementeerd, is de COM methode ook in gebruik genomen tussen software componenten op de<br />

MIPS. Inmiddels is KOALA uitgebreid zodat met een mix van Koala interfaces en IDL interfaces<br />

kan worden gewerkt. Van UHAPI is een beschrijving te vinden in Wikipedia (Engels).<br />

Communicatie tussen TriMedia componenten en MIPS componenten en componenten van de<br />

standby processor gebeurt altijd op basis van idl interfaces proxy/stub programmatuur, en runtime<br />

binding. Proxy en stub communiceren met elkaar middels remote procedure call's (RPC).<br />

Er is afgesproken om Koala integraal te gebruiken, hoewel het gebruik <strong>voor</strong> TriMedia software<br />

minimaal is: de h files die door de idl compiler worden gegenereerd worden niet rechtstreeks<br />

ingelijfd in de betreffende c files, maar vermeld in de cd file van de betreffende Koala component<br />

zodat Koala deze inlijft in de h file die hoort bij de overeenkomstige c file. Koala is hier <strong>voor</strong>al<br />

bedoeld om de de eigen build methode te vervangen door Koala met recht toe recht aan make. Deze<br />

de overgang is overigens niet van de ene op de andere dag gerealiseerd, en misschien niet eens<br />

volledig.<br />

1.4.2 Robuuste overgangen<br />

Met de keuze <strong>voor</strong> een component model is er ook gekozen <strong>voor</strong> struise overgangen.<br />

Infrastructurele wijzigingen dat zijn ze, de wijzigingen van interfaces. Afgesproken is dat interfaces<br />

niet wijzigen, als ze eenmaal zijn uitgegeven. Ze kunnen wel worden opgevolgd door een andere<br />

interface. Een component in zijn rol van server, kan een reeks opeenvolgende interfaces<br />

implementeren. Een component in de rol van client kan op een geschikt moment gewijzigd worden<br />

zodat die daarna de meest recente interface gebruikt. Pas als de laatste client over is wordt een oude<br />

interface beëindigd, en zijn implementatie uit de server verwijderd. Dit is de standaard methode. De<br />

methode kan ook omgekeerd werken. Als er diverse servers zijn kan een client een server<br />

ondervragen, en zich bedienen van één van de interfaces die de server aanbied. Pas als de laatste<br />

server en de laatste client over zijn naar de nieuwere interfaces worden de clients en servers<br />

vereenvoudigd door oude interfaces te verwijderen. Afhankelijk van de scope van de interface kan<br />

Pagina: 26 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

de methode gebruikt worden om overgangen binnen een subproject, of binnen een master project te<br />

realiseren.<br />

Soms, als er sprake is van een interface tussen slechts twee componenten of tussen modules die<br />

onderhouden worden door één team, worden software en interface wel eens gelijktijdig gewijzigd.<br />

In een enkel geval waarin de twee componenten beheerd worden door verschillende teams, sturen<br />

ze elkaar wel eens “baseline supplements” (patches) om de gelijktijdige wijziging te realiseren. Dan<br />

moeten ze er wel zeker van zijn dat de interface niet elders in gebruik is. Vaak is er enige tolerantie<br />

<strong>voor</strong> gemaakte fouten. Maar als er iets mis gaat met de invoering van een interface wijziging dan<br />

krijg je de wind van voren: “Waarom heb je de standaard niet gevolgd? Je weet toch dat je een<br />

interface niet mag wijzigen”.<br />

In een enkel geval wordt gebruik gemaakt van configuratie files, versie-nummers, of creatievere<br />

methoden (hardware herkenning bij<strong>voor</strong>beeld) om de situaties te herkennen, waar<strong>voor</strong> software in<br />

een overgang bruikbaar moet blijven. Ook is er de mogelijkheid om al dan niet met dezelfde<br />

interfaces een opvolger van een component te maken, en de oude pas weg te gooien als de nieuwe<br />

in gebruik genomen is.<br />

Zonder robuuste overgangen is teamwork en inter teamwork bij het maken van software<br />

waarschijnlijk zeer veel minder productief, en in ieder geval veel lastiger te organiseren. Van belang<br />

blijft het opruimen van oude oplossingen, als nieuwe volledig zijn geïmplementeerd.<br />

Tussen NXP en CE was er een procedure afgesproken. Bij de creatie van een nieuwe interface werd<br />

afgesproken op welk tijdstip de oude mocht vervallen. De nieuwe interface komt te staan in de<br />

folder ..\interfaces, de oude komt in ..\interfaces\obsolete, en verdwijnt daar op of na de afgesproken<br />

datum. Logisch, want het liefst hebben we de software simpel en toegespitst op bestaande situaties.<br />

Voor de andere oplossingen om overgangen met redundancy op te lossen, zijn geen afspraken<br />

gemaakt over opruimen en staat er niets in de “architectural notes”.<br />

Pagina: 27 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

1.4.3 Folder structuur en builds<br />

Vereenvoudigde NHSW structuur<br />

Toen Philips Semiconductors (nu NXP) en<br />

Philips CE gingen samenwerken om een<br />

hybride TV te maken, was er een<br />

standaard folder-indeling van CE en één<br />

van SC. Er is toen een nieuwe folderindeling<br />

afgesproken door de architecten<br />

van beide industrie groepen.<br />

Normaal is de path-name van een folder<br />

de name-pace van zijn inhoud. Voor de<br />

NHSW tree gold echter dan componenten<br />

binnen de tree een unieke naam moesten<br />

hebben. Toen dat niet meer was vol te<br />

houden is besloten dat componenten een<br />

unieke naam moeten hebben binnen een<br />

package, dus in Koala wordt wordt een<br />

component nu aangeduid met een package<br />

name en een component name. De<br />

package naam wordt in de nieuwe pd file<br />

als name-space gezet. Ieder package heeft<br />

een pd file in zijn top folder waarin de<br />

namen worden vermeld van de packages<br />

waarvan componenten worden gebruikt.<br />

Als meerdere componenten dezelfde naam<br />

hebben dan wordt ze in de pd files een<br />

alias toegewezen.<br />

Toen ik NXP verliet werd de “builds”<br />

folder niet gearchiveerd in een <strong>revision</strong><br />

<strong>control</strong> system, en ik heb niet meegemaakt<br />

dat de “project” folder enige inhoud had.<br />

Een folder als “connmgr” heeft typisch<br />

een package structuur, terwijl de<br />

subfolders in “private” en “public” typisch<br />

een opsomming zijn van componenten die<br />

een component structuur hebben, hoewel<br />

daarin ook een folder <strong>voor</strong>komt met de<br />

naam “interface”.<br />

Deze folder-structuur is momenteel één enkele boom, <strong>voor</strong> alles wat er geproduceerd wordt aan<br />

program libraries, en executables en dergelijke. In de eerste fase van een build ontleedt Koala alle<br />

Koala files in de boom, ook als ze niet nodig blijken te zijn <strong>voor</strong> het target van de build procedure.<br />

Gezien de omvang inmiddels (tientallen gigabytes) zal in de toekomst waarschijnlijk gezocht<br />

worden naar een manier om van een boom over te gaan op een bos van kleine bomen, die zoveel<br />

mogelijk onafhankelijk van elkaar kunnen worden bijgehouden, en ieder een eigen executable<br />

Pagina: 28 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

binary levert, met misschien een dynamische library. Als de TV start moet dus van elke tree uit het<br />

bos een binary worden geladen, want deze binaries moeten samenwerken. Ontwikkelaars zouden<br />

dan mogelijk minder tijd kwijt zijn aan het uitvoeren van build procedures. Deze weg is ingeslagen<br />

door CE die, ik meen in een “SPACE” folder, een aantal van de applicatie, product en tool packages<br />

heeft geplaatst buiten de NHSW tree (in een super tree), en daarop eigen build procedures gebruikt.<br />

Binnen de NHSW tree bleven: Tools, Middleware, Operating system, Audio/Video. Ik neem maar<br />

aan dat dit een trend is die doorzet.<br />

Iets dergelijks bestond reeds, Er is een MIPS executable, <strong>voor</strong> iedere TriMedia is er één, <strong>voor</strong> de<br />

stand-by processor is er één, (<strong>voor</strong> de DSP's natuurlijk ook, maar die staan niet in de folder<br />

structuur). Maar op de dag dat ik gepensioneerd werd was dit niet gerealiseerd in de folder<br />

structuur. Source code <strong>voor</strong> de één kan in principe zelfs staan in dezelfde folder als die <strong>voor</strong> een<br />

ander.<br />

De folder structuur herbergt packages (subsystems). Packages bevatten “private” en<br />

“public”onderdelen. Het is de bedoeling dat software in andere packages slechts refereert aan public<br />

onderdelen, zodat er <strong>voor</strong> de beheerders van het package nog enige implementatie vrijheid blijft<br />

bestaan. Met de nodige mitsen en maren kan gesteld worden dat een wijziging in een package die<br />

het publieke deel daarvan intact laat, slechts regressie kan veroorzaken in het eigen package. De<br />

mitsen en maren worden ook wel “semantisch” genoemd: het publieke deel moet ook semantisch<br />

intact blijven. Tot nu toe is het de gebruikers van een package altijd weer gelukt om aan te tonen dat<br />

het semantisch inzicht van de beheerders onvolkomen is. Het standpunt van de beheerders is<br />

evenwel dat gebruikers zich moeten beperken tot gebruik van het package binnen de semantische<br />

begrenzingen, hoe onvolkomen die ook zijn beschreven: “je kunt het toch wel aanvoelen”. Tot de<br />

publieke onderdelen behoren de public components, public interfaces, en public data definitions.<br />

De folder structuur is niet van de éne dag op de andere tot stand gekomen, hij is ontwikkeld, en dat<br />

heeft geleid tot verhuizingen van de source code. Zelfs de package indeling is aan wijzigingen<br />

onderhevig. Het systeem dat ik ga beschrijven zou dat moeten faciliteren, maar ik denk momenteel<br />

dat dat gedeeltelijk lukt <strong>voor</strong> herstructureren binnen een package, maar dat het me niet lukt <strong>voor</strong><br />

herstructureren over packages. Niet dat het niet kan, maar het <strong>revision</strong> <strong>control</strong> system levert geen<br />

support: er kan geen verwantschap vastgelegd worden tussen twee programma's die in<br />

verschillende packages <strong>voor</strong>komen.<br />

1.4.4 Afbakening NXP<br />

De eerste Digitale TV die werd ontwikkeld was <strong>voor</strong> wat betreft de MIPS software gebaseerd op<br />

een bestaande software stack van CE. Het MIPS gedeelte dat NXP <strong>voor</strong> zijn rekening nam bevatte<br />

nog een ruim aandeel “applicatieachtige” functionaliteit, Bij<strong>voor</strong>beeld het bijhouden van de<br />

frequenties en eigenschappen van TV stations, of het kiezen van het beeld-formaat. De API<br />

(verzameling interfaces van de NXP laag) bevatte daar<strong>voor</strong> veel functies. Momenteel trekt NXP<br />

zich terug op een “driver layer” die aangestuurd wordt via een “glue layer”. Dit in de hoop op<br />

kleinere en snellere “design-in” projects.<br />

Het package UHAPI bevat de interfaces, die de samenwerking van middleware met de driver laag<br />

Pagina: 29 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

definiëren. Gegevens hierover zijn te vinden in Wikipedia. Ik heb eerst gewerkt met de interfaces<br />

van Philips CE, en heb daarna <strong>voor</strong>namelijk gewerkt aan de overgang naar <strong>voor</strong>ganger NHAPI. De<br />

interfaces van NHAPI werden gebruikt als basis applicatie interface. In design-in en reference<br />

projects wordt NHAPI vaak uitgebreid met interfaces die de noviteiten in de chip aansturen.<br />

Ditzelfde gold indertijd <strong>voor</strong> UHAPI, ook die biedt een basis set.<br />

Er zijn klanten die bediend worden met een volledige software stack, en zelf bij<strong>voor</strong>beeld een logo<br />

toevoegen. Dit zijn OEM leveranciers. Voorheen had NXP een eigen software afdeling <strong>voor</strong> de top<br />

lagen, maar momenteel wordt deze software bijdrage uitbesteed.<br />

1.4.5 Diversity<br />

Sinds jaar en dag prefereren de tv fabrikanten één enkele productlijn in hun fabriek, met één enkel<br />

software programma <strong>voor</strong> alle regio's en alle variëteiten. Dit betekent: diversity wordt vastgesteld<br />

bij het aanzetten van de TV: runtime oplossing. Maar geheugen was duur en dus schaars in<br />

televisies, en de microprocessoren hadden hun beperkingen, en dus soms moest er toch gewerkt<br />

worden met meerdere software varianten en werden sommige variabelen in de runtime omgeving<br />

constanten in de compilatie omgeving. Welke variabelen? Dat varieerde natuurlijk. In de ene serie<br />

waren het <strong>voor</strong>al regio gerelateerde codes, in een andere <strong>voor</strong>al model en functionaliteit<br />

gerelateerde codes.<br />

Koala wordt gebruikt om “diversity” efficiënt te verwerken. Soms weet je <strong>voor</strong> een TV waar<strong>voor</strong> je<br />

software ontwikkeld al van te voren (op compilatie tijd) wat de diversity optie is, Voor een andere<br />

TV set moet je dit op run tijd detecteren. KOALA zorgt dat je de diversity in beide gevallen met<br />

dezelfde source code kunt bevragen. De object code die gegenereerd wordt door de compiler is<br />

compacter, als reeds op compilatie tijd bekend is welke optie geldt. Een van de technieken die de<br />

compiler gebruikt heet “dead code elimination”: de source code <strong>voor</strong> condities die niet gelden wordt<br />

verwijderd. Vaak wordt deze techniek gebruikt samen met een techniek die “constant propagation”<br />

wordt genoemd. Methoden die code optimaliseren zijn reeds in de jaren zestig en zeventig<br />

ontwikkeld. De diversity parameters die of op runtime of op compilatie tijd een waarde kunnen<br />

krijgen waren er in ieder geval al in de jaren tachtig. Toen besloten is om over te gaan op een<br />

componenten structuur, is er veel aandacht aan besteed om dit te behouden, en zelfs te verbeteren.<br />

Vandaar dat de componenten van KOALA geen binaries zijn, maar folders met source code.<br />

Het Koala engine zorgt er<strong>voor</strong> dat bij een ”start” module in een component (vergelijk het maar met<br />

de ”main” procedure in C) de componenten en modules worden gezocht die samen een executable<br />

vormen. Dit gebeurt via de “interface instances”. Ook dit engine wordt gestuurd door diversity, en<br />

voert “dead code elimination” uit op het niveau van componenten en modules , die wel of niet<br />

meegenomen worden.<br />

Voor de herbruikbare C source code betekent dit ook wel iets. Soms geldt:<br />

#define a b<br />

soms<br />

int a = diversity_a();<br />

met alle consequenties van dien <strong>voor</strong> wat betreft het gebruik van parenthesis (), switch statements<br />

enzo<strong>voor</strong>t, bij een referentie naar a of b.<br />

Het streven is ooit geweest om de laatste software versie van NXP te kunnen gebruiken in alle<br />

vorige projects en dit te realiseren met diversity. Maar zodra gewijzigde software niet meer getest<br />

Pagina: 30 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

wordt op een vorige televisie, dan is ze daar niet meer betrouwbaar. (Het is zelfs zo dat in de<br />

allerlaatste fase van een project, als tests nog haast uitsluitend plaatsvinden op builds van het<br />

“product”, dat dan een build <strong>voor</strong> het testen met een test harness vaak mislukt. Dit is een algemene<br />

regel: als verificatie ontbreekt, dan is regressie het gevolg. De “standaard” diversity is belangrijk<br />

<strong>voor</strong> een snelle aftrap van een project. De diversity tussen de modellen binnen een project moet<br />

zich vaak ontwikkelen binnen het project.<br />

Binnen de NXP packages werd diversity als volgt geïmplementeerd. Basis is een aantal parameters<br />

die de variant van de televisie beschrijven. Iemand gaat werken aan een component (delta<br />

processing of zo) en komt er achter dat de component varianten en instellingen niet rechtstreeks<br />

afhankelijk zijn van de basis, maar daar door logica en berekening uit zijn af te leiden. De varianten<br />

van de component hebben hun eigen parameter set. Er is in het begin is er een diversity component<br />

gemaakt die middels een diversity interface bevraagd kon worden om de diversity van een<br />

component te leveren. Nu maken de componenten deel uit van componenten die een platform deel<br />

representeren, platform delen zijn componenten binnen de platform component en naast de platform<br />

component staat de diversity component. De diversity interfaces van de kleine componenten werden<br />

in het platform deel verenigd tot een grotere interface, en in het platform tot één geheel. Nu kwam<br />

het <strong>voor</strong> dat sommige componenten om dezelfde diversity parameter vroegen. In de samengestelde<br />

interface kwamen dus functies in enkelvoud <strong>voor</strong> die in de platform cd file tot een return waarde in<br />

meerdere interfaces moest leiden, en zo ook in de deel platform cd file. Toen dit systeem bedacht en<br />

geïmplementeerd werd door mensen <strong>voor</strong> wie Koala nieuw was, (en misschien kon Koala toen nog<br />

niet wat nu mogelijk is) is dit zo gebeurt dat in de diversity module van een (deel) platform<br />

component ieder functie call vanuit een component afzonderlijk opgeloste met een functie call via<br />

de samengestelde interface. Dit bleek zeer onderhoudsgevoelig. Voor diversity interfaces maakten<br />

we trouwens een uitzondering, geen enkele wijziging leidde tot een nieuwe interface, deze interface<br />

mocht gewoon wijzigen. Ondanks de onhandigheid, is er in geen van de projects erna besloten tot<br />

herontwikkeling.<br />

Als er in product family een tv <strong>voor</strong>komt waarvan een eigenschap op compile time bekend is dan is<br />

die eigenschap een diversity parameter. Voor diversity geldt als ze in één van de andere televisies<br />

geen compile time diversity is dat ze moet zijn te determineren door automatische detectie van<br />

hardware karakteristieken, of dat ze moet worden opgegeven door een fabrieksmedewerker, of door<br />

een dealer, of door een eindgebruiker. Normaal worden de run time diversity parameters<br />

vastgesteld tijdens initialisatie van het systeem. Als de diversity wordt ingesteld door dealer of<br />

fabricage medewerker, dan moet opnieuw worden gestart om de wijziging te activeren. Maar van<br />

een eindgebruiker wordt dit doorgaans niet verwacht. Wat tussen sommige televisies diversity is,<br />

kan in een andere een gebruikers optie zijn. Ik heb nog niet gezien dat dit met diversity is geregeld.<br />

Het binden van parameters aan waarden mag dan gebeuren tijdens initialisatie, maar dat betekent<br />

niet dat de diversity alleen dan geraadpleegd wordt. Raadplegen gebeurt <strong>voor</strong>tdurend.<br />

Tuner karakteristieken maken deel uit van de diversity. Proactief worden van tuners de<br />

eigenschappen vastgelegd. Iets soortgelijks geldt <strong>voor</strong> onderdelen als beeldschermen. Tuners en<br />

beeldschermen zijn in ieder geval <strong>voor</strong> een deel op compile time bekend. Soms wordt in de fabriek<br />

gekozen uit enkele typen, dan is op compile time de selectie bekend.<br />

Andere zaken die mogelijk proactief bijgehouden worden, maar vaak ook het gevolg zijn van field<br />

calls, of field tests. Soms wordt van een bepaald invoer apparaat geconstateerd dat zijn signalen<br />

beter afwijkend kunnen worden behandeld. Soms geldt dit <strong>voor</strong> de signalen van kabel exploitanten,<br />

Pagina: 31 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

en tv stations. De dealer kan soms informatie geven over de signaal leveranciers ter plekke. Maar<br />

toch, de eigenschappen van invoer-apparaten en kabel exploitanten en dergelijke kunnen momenteel<br />

beter uit een database van het internet opgehaald worden. Die van kabel exploitanten veranderen, tv<br />

stations komen en gaan en apparaten komen er steeds meer. Er wordt steeds meer<br />

gestandaardiseerd, en certificering kan groeien in kwaliteit. Soms kan iets dat eerst mogelijk met<br />

diversity geregeld was, eruit verdwijnen.<br />

1.4.6 Koala / Horcom<br />

Koala is gemaakt <strong>voor</strong> resource restricted systems. Dit zijn kleine micro computers met weinig<br />

geheugen en processing power. Ook is Koala gemaakt <strong>voor</strong> product families, en implementeert ze<br />

efficiënt diversity. De bijdrage aan de diversiteitsafhandeling wordt nog steeds gewaardeerd. De<br />

processoren in de TV chip kun je niet meer zo heel erg resource restricted noemen, maar daar<strong>voor</strong><br />

geldt baat het niet het schaadt ook niet, en uiteindelijk is Koala enigszins uitgebouwd <strong>voor</strong> COM.<br />

Diversiteit wordt gebruikt om bij elk source programma een toegespitste h file te maken, nou ja niet<br />

bij allemaal, alleen degenen die van belang zijn <strong>voor</strong> een bepaalde televisie. De compile time<br />

oplossingen van Koala profiteren van het feit dat er in een televisie veel singleton componenten<br />

<strong>voor</strong>komen, of enkele met name te noemen instances. Zo is er slecht één tuner, en slechts enkele<br />

decoders (een decoder kan slechts enkele signaal-soorten decoderen), enzo<strong>voor</strong>t. In veel televisies<br />

kan men werken met een “Dual Window” of met “Picture in Picture” Dan moeten er voldoende<br />

component instances zijn <strong>voor</strong> de verschillende video-stromen. Bij deze componenten hoort ook<br />

slechts één driver. De component instances hoeven meestal niet dynamisch gecreëerd te worden en<br />

de interfaces behoeven meestal niet dynamisch te worden gelegd. Koala is in deze situatie goed op<br />

zijn plaats. De componenten staan in een statische structuur, en de interfaces zijn vaste<br />

verbindingen tussen de componenten, die tijdens compilatie gedeeltelijk met behulp van “inline”<br />

code worden gerealiseerd. Een component die 2 instances realiseert implementeert soms twee sets<br />

“instances” van dezelfde interfaces. De ene set kan verbonden zijn met client component A, en de<br />

andere met B. De compile time binding van Koala werkt samen met een optimizing c compiler en<br />

zo wordt door Koala en compiler geoptimaliseerde code geproduceerd.<br />

Een verstoring van dit beeld treedt op omdat er in tv's gezapt en geschakeld wordt. Als je zapt van<br />

een analoge tuner naar een digitale dan moet het signaal een andere route gaan volgen; als je naar<br />

een dvd speler kijkt moet het signaal een andere route volgen dan wanneer je kijkt naar een<br />

uitzending: de componenten moeten zich steeds anders aaneenrijgen om een route te maken. Voor<br />

hardware componenten wordt dit geregeld met hardware switches en blijft het statische beeld<br />

feitelijk intact, maar <strong>voor</strong> TriMedia (software) componenten wordt het signaal pad geformeerd,<br />

door de betreffende component instances dynamisch te creëren en dynamisch te linken aan<br />

<strong>voor</strong>ganger en opvolger. Ook dan blijft het vaak singleton werk, want er kunnen slechts enkele<br />

signaal-stromen tegelijk door een televisie lopen. Een en ander heeft ertoe geleid dat de hardware<br />

routes worden geregeld met “Horcom”, terwijl TriMedia routes worden geregeld door een<br />

“Connection Manager”. Een ontwikkeling die nog altijd door mij wordt betreurd, het had met één<br />

methode gekund: “Horcom vernieuwd”.<br />

“Horizontal communication: a style to compose <strong>control</strong> software”, Rob van Ommering Software<br />

Practice & Experience Volume 33 , Issue 12 (October 2003) .<br />

Pagina: 32 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

Horcom discussies, gesprekken bij de koffie automaat<br />

Sommigen binnen NXP wil eigenlijk af van Koala, omdat Philips CE de enige klant is die ermee<br />

werkt. Voor NXP zelfstandig werd nam PS het onderhoud over van CE als ik mij goed herinner,<br />

maar ik geloof niet dan het beheer meegenomen is toen PS NXP werd. Binnen PS was het<br />

misschien wel stiekem de bedoeling om het te killen. Maar tot nu toe is de berg eigen NXP software<br />

waarin het gebruikt wordt te groot om het weg te gooien, bovendien heeft men met Koala ook<br />

beheerders en gebruikers overgenomen, en die willen van geen wijken weten. Koala is typisch zo'n<br />

methode waarvan je denkt dat je hem beheerst, terwijl je er eigenlijk gewoon aan verslaafd bent.<br />

Wat <strong>voor</strong> Koala geldt geldt ook <strong>voor</strong> Horcom: CE is de enige klant die ermee werkt, en eigenlijk<br />

willen sommigen er daarom van af in de hoop beter aan te sluiten bij de rest van de markt. Veel<br />

klanten gebruiken geen NXP tuner, en geen NXP channel decoder, of vullen de chip aan met eigen<br />

chips of bolt-on boards, en komen daar<strong>voor</strong> dan met eigen software: de platform software werkt<br />

dan slechts ten dele met Horcom, of via omwegen of gedeeltelijk imiteren worden de componenten<br />

van de klant opgenomen in Horcom. Daar staat tegenover dat NXP zeer veel heeft geïnvesteerd in<br />

de platform besturingssoftware die er nu is, met een project van tussen de veertig en zestig mensen<br />

gedurende meer dan een jaar. In feite was het project de allerlaatste poging om een digitale tv op<br />

de markt te zetten. Koala en Horcom maken deel uit van, of misschien wel “zijn”, de infrastructuur<br />

van de platform besturingssoftware. Als je ze vervangt moet je feitelijk overnieuw beginnen.<br />

Vandaar misschien de methode: reuse en langzaam terugdringen.<br />

Horcom als architectuur principe. Het idee is duidelijk. De componenten structuur van de hardware<br />

wordt nagevolgd door de software. In principe is dit een anti reuse bepaling: je volgt niet de<br />

structuur van de vorige software generatie, maar de structuur van de huidige hardware (en<br />

TriMedia) componenten, dus reuse is komt hoogstens <strong>voor</strong>t uit reuse van onderliggende<br />

componenten. Dit volgen van de structuur betreft overigens niet de hiërarchische structuur maar<br />

uitsluitend de netwerk structuur: het transformatie model zeg maar. Ondanks dat dit eigenlijk heel<br />

duidelijk is, is er toch altijd wel tegen gezondigd. Het is gewoon te verleidelijk om software<br />

opnieuw te gebruiken, en wat te knutselen om het werkend te maken.<br />

Het capability model van Horcom is te simpel. Oorspronkelijk zou een Horcom node de volledige<br />

verzameling capabilities van de onderliggende transformatie component vermelden, maar<br />

uiteindelijk werden slechts de signaaleigenschappen geregistreerd die de component kon<br />

vaststellen. Voor deze data is een simpele methode gekozen, zonder zaken als information hiding.<br />

Dit alles was gerechtvaardigd op de vroegere kleine micro computers met weinig geheugen, maar<br />

nu is er behoefte aan betere methoden, zoals uit de twee volgende paragrafen blijkt.<br />

De taken van Horcom: connection management en het verzorgen van de (bidirectionele: upstream<br />

en downstream) communicatie tussen de componenten in de transformatie laag. Connection<br />

management is op te delen in verschillende taken, zoals het bepalen van de blanking en muting<br />

periode tijdens een zap, het afbreken van de oude routes en het instellen van de nieuwe, Het<br />

beëindigen en opnieuw bemiddelen tussen de transformatie componenten die gegevens produceren<br />

en degenen die informatie behoeven. Met de introductie van de “com” component methode zou<br />

daar een deeltaak bij moeten komen: het dynamisch koppelen en ontkoppelen van de bestuurlijke<br />

interfaces (van UHAPI) aan de componenten in de transformatie laag. Het bedienen van zo'n<br />

interface is natuurlijk ook een “capability” van de component.<br />

Ook het binden van interfaces tussen de laagste besturings-componenten ontbreekt. Veel van deze<br />

componenten zijn één op één vast gerelateerd met drivers, en daarmee vast gerelateerd aan een<br />

Pagina: 33 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

Horcom node. Met name de engineers van het audio gedeelte implementeerden een Horcom node<br />

met besturingsinterfaces zonder onderliggende transformatie component, en vandaar uit een<br />

complex geheel aan route begeleidende (KOALA) interfaces naar nodes die wel een onderliggende<br />

transformatie component bedienen, zo omslachtig zelfs dat het plug en play karakter verloren is<br />

gegaan. Het stromen model van de eerste chip die we programmeerden kon daardoor nog steeds<br />

herkend worden in de software <strong>voor</strong> de laatste chip die ik heb meegemaakt. Via deze interfaces<br />

vindt zowel gegevens uitwisseling plaats als ook besturing. Die route begeleidende interfaces<br />

hebben duidelijk een work-around karakter. Ze zijn er omdat Horcom ze niet biedt.<br />

Toen MG-R en DVP geïntegreerd werden ontdekte men van elkaar aan de ene kant Horcom, en aan<br />

de andere kant TSSA (TriMedia Streaming Software Architecture) Men startte de discussie met ze<br />

als alternatieven te zien. De volgende twee paragrafen zijn het resultaat van de discussies toen.<br />

Een deel van de Horcom discussies zijn analoog aan de delegeren of besturen discussies in<br />

verticale organisaties. Er is de vaststelling dat veel van de horizontale communicatie “met de<br />

stroom” meegaat, en dus als metadata met de stroom meegestuurd kan worden, zoals je in een<br />

fabriek halffabricaten kunt transporteren in een bak met een kaart met streepjescodes. De<br />

informatie-stroom in tegengestelde richting zou te gering zijn <strong>voor</strong> een algemene oplossing, en zou<br />

dus maar met incidentele oplossingen moeten worden bewerkstelligd. Dus waarom dan nog<br />

Horcom? Eigenlijk was dit een opvatting gebaseerd op het gegroeide idee dat er slechts data<br />

uitgewisseld wordt tussen transformatie componenten. In de praktijk wordt er ook data van of <strong>voor</strong><br />

het management horizontaal uitgewisseld, en worden opdrachten in stukjes geknipt en doorgegeven<br />

aan de transformatie-laag. Dit komt omdat Horcom het enige horizontale management platform is<br />

in de TV. Zo zijn er zelfs enige Horcom nodes zonder een bijbehorende transformatie component.<br />

Zonder deze nodes zou mogelijk een “verzuilde” besturingslaag zijn ontstaan, terwijl nu de<br />

verzuiling alleen bestaat <strong>voor</strong> de Horcom nodes, de drivers en hun onderliggende transformatie<br />

componenten (in het audio gedeelte is het wel wat complexer geworden, dan kleine zuiltjes).<br />

Zuivere verzuiling zou de toenemende rol van applicaties hinderen. Het verdelen van applicatie<br />

informatie naar transformatie componenten, het verzamelen van informatie t.b.v. applicatie<br />

componenten en het verdelen of herindelen van opdrachten komt deels omdat er op transformatie<br />

niveau creativiteit toegestaan wordt met de component indeling. Daardoor past een UHAPI<br />

interface niet altijd precies op één hardware component, of één TriMedia component. Voor een<br />

ander deel omdat er altijd wel enige redundancy bestaat in de transformatie laag waardoor er keus<br />

is waar een bewerking of een waarneming moet plaatsvinden. Die keus wordt doorgaans<br />

gerealiseerd in de management laag, dus in het horcom netwerk. Die redundantie is er bijna zeker,<br />

als de NXP chip wordt begeleid door elektronica die niet van NXP afkomstig is, en soms ook als<br />

additionele elektronica wel is geleverd door NXP, en af en toe is ze er zelfs binnen de one-chip<br />

televisie.<br />

Het andere deel van de discussies is een plug en play discussie. Horcom heeft een typisch plug en<br />

play aspect: plaats een Horcom node in het model en de onderliggende transformatie component<br />

kan worden bestuurd en doet mee met connection management. Al moet je naar de hardware nog<br />

wel een driver maken, en vaak de driver aansturen vanuit een functionele module. Dit heeft<br />

natuurlijk een prijs:<br />

bij elke zap, en bij sommige signaal veranderingen, wordt <strong>voor</strong> elke output (speakers, window,<br />

connectoren) een route gezocht naar de gewenste input. Iets zoeken is natuurlijk minder snel dan<br />

iets pakken.<br />

Het vaststellen van de blanking periode (drop/restore logica) gebeurt door meerdere malen<br />

Pagina: 34 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

sequentieel routes in het netwerk te doorlopen.<br />

De daadwerkelijke gegevens uitwisseling werkt eveneens, door sequentieel routes langs te gaan om<br />

componenten te notificeren.<br />

De routes worden doorlopen doordat iedere node op zijn beurt de betreffende functie aanroept in<br />

een naastgelegen node. Dit betekent dat een zeer grote call-stack moet worden bijgehouden.<br />

De tegenstanders van Horcom bepleiten als oplossing: houdt het model buiten de TV software<br />

(desnoods op een schoolbord), doe daar een model zap, registreer wat er dan gebeurt, en breng het<br />

geregistreerde aan in de TV software. Daartoe gebruiken ze dan in de TV de “connection manager”<br />

<strong>voor</strong> het koppelen van interfaces aan platform componenten, en het kennis systeem <strong>voor</strong> de register<br />

waarden (inclusief switches).<br />

In wezen betreft deze discussie dus het wel of niet verplaatsen van acties in de runtime omgeving<br />

naar het ontwerp stadium.<br />

Om reeds in de design fase (van de chip of de set) een Horcom model te maken is natuurlijk een<br />

goed idee. Je kunt ermee testen of alle signaal paden altijd over voldoende resources kunnen<br />

beschikken, en misschien ook of elkaar storende onderdelen tegelijk actief kunnen zijn.<br />

De keuze om het audio / video netwerk te modelleren met KOALA interfaces tussen Horcom nodes<br />

is niet helemaal gelukkig. Er zijn inmiddels veel nodes in dit netwerk, dus Horcom nodes zijn geen<br />

singletons (er zijn er aanzienlijk veel meer dan één of twee). Met KOALA interfaces is er is een<br />

aanzienlijke hoeveelheid node specifieke code. Dank zij uitgekiende Horcom macro's is de<br />

hoeveelheid primaire source code beperkt, maar na macro expansie is er relatief veel c code:<br />

Horcom is een geheugen vretertje. We zouden misschien beter over kunnen gaan op een netwerk<br />

structuur opgebouwd uit objecten met vtables, die met elkaar verbonden zijn middels pointers.<br />

De meeste horcom nodes hebben meer dan één ingang en meer dan één uitgang. Nodes tot nu toe<br />

zijn: source, destination, one-to-one, fork (die zorgt <strong>voor</strong> een vertakking van een input signaal in<br />

meerdere output signalen), switch (dit is altijd een source selectie switch: de output pinnen worden<br />

erdoor gegroepeerd in clubs die naar dezelfde input pin kijken of luisteren, of mogelijk één output<br />

pin die afwisselend kan kijken naar steeds één input pin tegelijk).<br />

Als je twee forks bekijkt dan kan de éne het volledige signaal splitsen in 2 volledige signalen,<br />

terwijl de ander het signaal ontleedt in onderdelen die ieder een eigen route volgen. Bij<strong>voor</strong>beeld<br />

audio/video wordt gescheiden, of een video signaal splitst in een Y route en een BlueRed route. Er<br />

zijn ook hybride forks waarin een gedeelte van het signaal <strong>voor</strong>komt in meerdere teeth.<br />

Forks in het Horcom model hoeven niet altijd te bestaan in de hardware: in een scart plug<br />

bij<strong>voor</strong>beeld heeft ieder signaal zijn eigen poort, maar in het horcom model zijn die gebundeld in<br />

één route bij de source node, en wordt de route met een fork gesplitst in een audiogroep, een<br />

CVBS/YC groep en een RGB groep.<br />

We missen nog één type, een tegenhanger van de fork, waar signalen bijeen komen, zoals in de<br />

video mixer, waar dual windows en menu's kunnen samenkomen in het screen, en de video decoder<br />

van de oorspronkelijk analoge signalen, waar sync signalen binnenkomen die een andere route<br />

hebben afgelegd dan de RGB signalen, en waar het luminance signaal via een andere route<br />

binnenkomt dan de chrominance signalen. De trajecten achter de mixer en vóór de decoder zijn<br />

inmiddels significant.<br />

De tegenhanger van de signaal ontledende fork, bij<strong>voor</strong>beeld de analoge video decoder zou<br />

composer genoemd kunnen worden of counter-fork.<br />

Mogelijk wordt de mixer geïmplementeerd met twee half autonome horcom netten, immers zijn<br />

Pagina: 35 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

output is een source <strong>voor</strong> het net dat er op volgt, terwijl zijn inputs een destination zijn van het net<br />

dat eraan <strong>voor</strong>afgaat. Achter de mixer is er bij<strong>voor</strong>beeld een netwerkje met een route <strong>voor</strong> de<br />

onmiddellijke ongebufferde presentatie van de video van spelcomputers en de route met frame<br />

buffers die dienen <strong>voor</strong> het plausibel presenteren in de beeld frequentie en resolutie van het scherm.<br />

(Tijdens de nationale voetbal gekte hebben de huizen in de straat waaruit het eerst een gejuich<br />

opstijgt nog een ouderwetse analoge tv, met een analoge provider en de huizen waaruit het gejuich<br />

een aantal seconden later komt een digitale met veel (frame) buffers tussen camera en scherm).<br />

Er is een idee om switch en fork te combineren zodat in de ene tv een input en een output pad “hard<br />

coded” of middels diversity gekoppeld kunnen zijn, terwijl in een andere dynamisch middels<br />

switchen gekoppeld wordt. Die diversity bij<strong>voor</strong>beeld geeft hardware ontwerpers de mogelijkheid<br />

om een plug de ene keer aan te sluiten op poort A van de chip, en de volgende keer op poort B. De<br />

huidige implementatie met macro's mist die mogelijkheid, waardoor de diversity methode die nu in<br />

gebruik is erg omslachtig is. Het is typisch een work-around oplossing.<br />

Er lijkt soms een tegenstrijdigheid te bestaan: om switches consequent met Horcom te regelen is er<br />

een verfijnd netwerk nodig, waarin ieder subsignal zijn eigen route krijgt. Voor het communiceren<br />

met drivers is er een minder verfijnde structuur nodig waarbij één enkele horcom signaal route een<br />

driver aandoet. (Mogelijk zal er wel altijd een grijs gebied zijn waarin een setting kan worden<br />

beschouwd als een switch, of als een gewone setting.)<br />

Er is ook een idee om input selectie switches te implementeren in de software als “open/close<br />

switches” aan de input zijde, waarvan er tegelijkertijd slechts één open mag staan. Zo'n switch kan<br />

dan soms reduceren tot een output die slechts verbonden is met één switch.<br />

De combinatie connection manager / horcom is niet bepaald gelukkig. De huidige connection<br />

management component ziet eruit als een kind met een waterhoofd. Ook dat is een reden om het<br />

hele concept te herzien.<br />

Inmiddels is de connection-search-method behoorlijk geoptimaliseerd, zijn computers snel, en zijn<br />

er design patterns beschikbaar <strong>voor</strong> gegevens uitwisseling (bij<strong>voor</strong>beeld observer en callback).<br />

Ook zouden iteratieve methoden kunnen worden gebruikt, in plaats van call stacks. dus ik zou<br />

zeggen gebruik het Horcom model in de TV <strong>voor</strong> connection management, het opzetten van<br />

upstream directed communication die afkomstig is van transformatie componenten, en upstream en<br />

downstream directed information die afkomstig is van management componenten, of die er<strong>voor</strong><br />

bestemd is. Ook, als je data meestuurt met het signaal naar de volgende component, zou je een<br />

oplossing kunnen kiezen die verbergt of er horizontaal of verticaal, stroom opwaarts, of met de<br />

stroom mee gecommuniceerd wordt.<br />

“Design Patterns, Elements of Reusable Object-Oriented Software” by Erich Gamma, Richard<br />

Helm, Ralph Johnson, John Vlissides. Addison-Wesly, ISBN 0-201-63361-2<br />

Voordat de Horcom macro's gemaakt waren, programmeerde ieder zijn eigen horcom nodes, daarna<br />

was het een kwestie van een paar regels macro's. Dit had een eigenaardig effect. Voor veel<br />

programmeurs werd het horcom netwerk een geheimzinnige black-box die op magische wijze zijn<br />

nuttige werk deed. Het was niet langer een gemeenschappelijk concept. Dank zij de macro's was<br />

ook nog eens knap lastig geworden om bij<strong>voor</strong>beeld breakpoints te zetten, en ook adequaat loggen<br />

om een fout te ontdekken was een kunst geworden. Toch was horcom vaak belangrijk bij het<br />

Pagina: 36 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

analyseren van fouten. Bij <strong>voor</strong>keur werd daar<strong>voor</strong> een deskundige ingeschakeld. Ook werden vaak<br />

toch maar alternatieve foutanalyse methoden gebruikt. Mocht het ooit komen tot een redesign van<br />

horcom dat zouden debug en logging faciliteiten op toegankelijke wijze geïmplementeerd moeten<br />

worden.<br />

Bij Philips-CE in Brugge was horcom een gedeeld concept. In het gezamenlijke CE/SC project<br />

TvDoc, werden de horcom macro's ontwikkeld, die daarna in het gezamenlijke Jaguar project<br />

gebruikt werden in de eerste volledig digitale TV (op de meeste inputs en outputs na). In het Jaguar<br />

project werd horcom een black-box <strong>voor</strong> het SC team, maar was het nog steeds een transparant<br />

concept <strong>voor</strong> het CE team, ondanks de macro's.<br />

Momenteel is NXP verantwoordelijk <strong>voor</strong> deze connection management onderdelen. Mogelijk in de<br />

toekomst laat hij dit over aan zijn klanten. Maar zoals het er bijstaat (anno 2008) draagt NXP niet<br />

bepaald een gespreid bed over aan die klanten.<br />

1.4.7 Power modes en hardware die geen deel uitmaakt van het<br />

audio/video platform<br />

Als je erover nadenkt besef je dat het netwerk model van Horcom onvoldoende is om alle hardware<br />

te besturen. Een analogie: het licht knopje van de fabriekshal is niet te vinden in een productielijn.<br />

Het blijkt dat hardware vaak hiërarchisch is opgebouwd, en niet alleen maar een netwerk structuur<br />

heeft. Een component die zowel de DAC's (digital to analog converter) als de ADC's bevat bevindt<br />

zich zowel aan de <strong>voor</strong>zijde als aan de achterzijde van het transformatie netwerk, en heeft een eigen<br />

power management, waaraan mogelijk geen recht wordt gedaan als uitsluitend actie wordt genomen<br />

als een ADC of DAC benaderd wordt in het netwerk.<br />

Er is software die bestaat uit meerdere componenten: de Power componenten, die er<strong>voor</strong> zorgen dat<br />

precies die hardware en software opgestart is als nodig is <strong>voor</strong> de onderhanden taken. Hierbij<br />

kunnen typische Horcom drivers en hardware aangestuurd worden, maar ook kunnen hardware en<br />

drivers worden aangestuurd die niet met Horcom bediend worden.<br />

Er zijn diverse power modes, waarbij hardware wel of niet is opgestart. Als 's nachts het<br />

elektronisch programmablad wordt opgehaald, hoeft het scherm niet aan te staan. In standby mode<br />

is bij<strong>voor</strong>beeld de stroom afgehaald van MIPS en TriMedia. Je kunt de TV gebruiken als radio,<br />

zonder video.<br />

Als je een TV uit standby mode haalt wordt de audio/video mode bereikt via een serie fasen om te<br />

zorgen dat niet in één klap alles aanstaat, want dat geeft werkelijk een klap, waarbij elektronica kan<br />

beschadigen. Ook uitzetten loopt om dezelfde reden bij <strong>voor</strong>keur via fasen. Ook deze fasen worden<br />

power modes genoemd. Goed planmatig opstarten is waarschijnlijk ook nuttig om te garanderen<br />

dat de elk elektronisch onderdeel na het opstarten in de gewenste start toestand staat.<br />

Enige <strong>voor</strong>beelden van hardware buiten het A/V platform: afstandbediening lezen, de wekker, de<br />

stroom <strong>voor</strong>ziening, het file system, alle communicatie met internet, USB, harde schijven zonder<br />

dat daar streaming bij betrokken is. Ook deze hardware wordt bedient met drivers, en valt buiten het<br />

competentie gebied van Horcom.<br />

Pagina: 37 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

1.4.8 Pumps en pump engines<br />

Van ouds her werkt embedded software met een "main loop" waarin events (messages) worden<br />

gelezen en afgehandeld. State variables en message types worden gebruikt om de procedure te<br />

determineren die de message verwerkt. Messages ontstaan door interrupts, en door het gebruik van<br />

de remote <strong>control</strong>, en ze worden gegenereerd door procedures in de main-loop. De messages komen<br />

meestal in een first-in first-out lijst. Soms is er geen lijst, dan mag in een doorgang van de mainloop<br />

hoogstens één message gegenereerd worden, en wel als laatste actie.<br />

Momenteel, nu de processors krachtig zijn en geheugen geen probleem, is één van de belangrijkste<br />

onderdelen van de ondersteunende component “os” het message systeem. In de message queues van<br />

de televisie kun je messages sturen die naast enige data het adres bevatten van de procedure<br />

waaraan de message is gericht. Per thread is er een main loop die de messages uit één queue<br />

afhandelt. Als zo'n message aan de beurt is dan wordt de betreffende procedure aangeroepen, met de<br />

parameters die in de message staan. Dit is meen ik afgekeken van MS Windows 3.1. Een message<br />

van een bepaald type wordt een pump genoemd. De message queue en de thread die de message<br />

afhandelt wordt pump-engine genoemd. De pump en pump-engine definitie stamt uit de MG-R<br />

poot.<br />

De software componenten communiceren met elkaar door procedure calls via hun interfaces.<br />

Methods in de koala interface worden rechtstreeks aangeroepen en niet via dit message<br />

mechanisme. Calls naar COM componenten, bij<strong>voor</strong>beeld remote procedure calls (RPC), worden in<br />

proxy/stub modules opgelost met behulp van synchronisatie middelen. Ik weet niet of dit is opgelost<br />

met de pump implementatie van de component “os”, maar ik vermoed van niet.<br />

Messages worden meestal gestuurd en ontvangen door procedures die tot dezelfde component, en<br />

liefst dezelfde source module, behoren. Zo wordt de uitvoering van een langdurig karwei<br />

opgesplitst in een serie kortstondige brokken, die door dezelfde pump-engine worden uitgevoerd.<br />

De afhandeling van een functie uit een koala of com interface wordt op deze manier in stukjes<br />

geknipt. Meestal worden meerdere karweien tegelijkertijd door dezelfde pump-engine afgehandeld:<br />

meerdere interface functies, van meerdere interfaces worden in stukjes geknipt. Het effect van een<br />

pump-engine is daarom <strong>voor</strong> een groot deel: non pre-emptive multitasking.<br />

Non pre-emptive multitasking met messages doet denken aan non-determinisme. Dat zou in<br />

overeenstemming zijn met de ontwikkelmethoden <strong>voor</strong> embedded software: met de DFD's (data<br />

flow diagrams) die sommige methoden gebruiken die het non-determinisme min of meer<br />

maximaliseren en het in ieder geval in kaart brengen. Embedded software engineers houden <strong>voor</strong>al<br />

daarom van non-determinisme omdat ze het om zeep kunnen brengen: het geeft je keuze<br />

mogelijkheden <strong>voor</strong> prioriteiten en daarmee <strong>voor</strong> volgorden, zodat real time doelen kunnen worden<br />

gehaald. Prioriteiten worden gerealiseerd door pump-engines te koppelen aan componenten, en<br />

prioriteiten aan pump-engines. Maar door de enorme hoeveelheid componentjes en message types<br />

in Tv's blijft er nog zeer veel volgorde ongedetermineerd.<br />

"Structured Development for Real-Time Systems Volume 1" van Paul T. Ward & Stephen J. Mellor.<br />

(1985 Prentice Hall ISBN 0-13-854787-4 025) (volume 2 en 3 zijn er ook).<br />

"Strategies for Real-Time System Specification" van D.J. Hatley & I.A. Pirbhai (Dorset House<br />

Publishing; New Ed edition (1 Jan 1988) ISBN: 978-0932633118 )<br />

Naast non determinisme zijn er in embedded software ook constructies waarbij de prioriteiten<br />

bijdragen aan de logica, in het ene geval werkt het programma logisch correct, in het andere geval<br />

Pagina: 38 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

fout. Het is de kunst om in de mix van keuzevrijheid en volgorde <strong>voor</strong>schrift, de brokjes<br />

programma-doorloop te <strong>voor</strong>zien van optimaal werkende prioriteiten: als de afhandeling van een<br />

message logisch moet <strong>voor</strong>af gaan aan die van een andere, dan mag zijn prioriteit zeker niet lager of<br />

gelijk zijn. Een elementair <strong>voor</strong>beeld: een implementatie van a=2*(b+1)<br />

a = b; (1)<br />

...<br />

a = a + 1; (2)<br />

...<br />

a = a * 2; (3)<br />

Na uitvoering van statement (1) wordt statement (2) uitgevoerd door afhandeling van message (m1)<br />

en statement (3) door afhandeling van message (m2). Als iedere message afgehandeld wordt in zijn<br />

eigen message queue, dan moet message (m1) afgehandeld worden met een grotere prioriteit dan<br />

message (m2), en message (m2) liefst met een lagere (of gelijke) prioriteit, dan de procedure die de<br />

messages verstuurde.<br />

Er zijn twee soorten messages:<br />

de timed message: de afhandelende procedure moet worden aangeroepen zodra de tijd<br />

verstreken is.<br />

De untimed message: de afhandelende procedure moet aangeroepen worden zodra de<br />

gelegenheid zich <strong>voor</strong>doet.<br />

Timed messages gaan vóór untimed messages. Overige prioriteiten worden geregeld met thread<br />

priorities. Een belangrijke toepassing van timed messages is het “polsen” waarmee hardware<br />

registers in de gaten worden gehouden. Er lijkt momenteel een tendens te zijn om dit te regelen met<br />

interrupts, maar de embedded software engineers staan enigszins wantrouwend tegenover<br />

interrupts: “we houden meer registers in de gaten dan waar<strong>voor</strong> interrupts bestaan, en bovendien, in<br />

elke chipset zijn er weer andere”.<br />

Polsen: Eigenlijk gebruikten we de term “pollen”. Het Engelse “to poll” is in feite, althans volgens<br />

mijn woordenboek, periodiek een steekproef nemen (periodiek een deelverzameling doormeten).<br />

Wij gebruikten het dus om periodiek een register te testen op verandering, dus zonder een<br />

deelverzameling te trekken.<br />

Daarnaast zijn er twee opties <strong>voor</strong> een message type<br />

● Het meest gebruikt is de optie dat een message van een bepaald type een eventuele<br />

<strong>voor</strong>gaande message van hetzelfde type overschrijft.<br />

● En er is de andere optie: alle messages van een bepaald type moeten worden afgehandeld.<br />

Er worden zeer veel replacing message types gedefinieerd, in plaats van weinig queuing message<br />

types, om de inschatting van de grootte van de message queue zo nauwkeurig mogelijk te kunnen<br />

doen.<br />

Een message kan door de procedure die de message verstuurd, worden geplaatst in de message<br />

queue van een bepaalde thread. In het jargon wordt de message queue van een thread een pump<br />

engine genoemd. Met een dergelijke resource begint de thread nog niet op een task te lijken. De<br />

component “os” spreekt echter over tasks, en niet over threads.<br />

Meestal gebruikt een component één (hoofd) task met message queue, zodat andere synchronisatie<br />

mechanismen, zoals semaphores, critical regions en dergelijke zoveel mogelijk vermeden worden.<br />

Pagina: 39 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

Als een (koala) component een procedure aanroept in een component die een andere task gebruikt,<br />

dan maakt de caller gebruik van een synchronisatie waarbij de task van de called component wordt<br />

stilgelegd nadat de lopende message is afgehandeld, de task van de caller wacht hierop. Dan wordt<br />

de call gepleegd, en daarna wordt de task van de called component weer geactiveerd.<br />

Remote Control signalen, signalen van knoppen die op de TV ingedrukt worden, audio en video<br />

veranderingen, enzo<strong>voor</strong>t. Al deze signalen veroorzaken een message op een pump engine. Al het<br />

pollen (periodiek <strong>control</strong>eren van een register) wordt geregeld met timed messages. Komt uit dat<br />

pollen een signalering <strong>voor</strong>t, dan is ook dat ook weer een message. Je hoeft niet altijd te pollen,<br />

vaak kun je of soms moet je gebruik maken van hardware interrupts. Dan stuurt de interrupt routine<br />

een message.<br />

De invloed op de interfaces van de componenten: Bij de meeste requests van een client component<br />

aan een server component wordt er geen waarde als antwoord geretourneerd, maar wordt later een<br />

callback procedure in de client aangeroepen door de server, met de afloop van het request. Soms<br />

biedt een interface een hybride oplossing. Dan wordt er een direct een antwoord geretourneerd als<br />

dat mogelijk is, maar anders wordt er een callback procedure aangeroepen. Dit is vaak nodig omdat<br />

de afhandeling van een request vaak in stukjes wordt geknipt met behulp van messsages. Soms is<br />

dat nodig omdat het tijd kost om iets te meten, soms is het wenselijk omdat gecommuniceerd wordt<br />

met een functie in een andere thread.<br />

Koala interfaces bieden geen rechtstreekse faciliteiten <strong>voor</strong> callback. Er is de mogelijkheid om naast<br />

een interface die nodig is <strong>voor</strong> de client en waarin de functie aanroepen staan naar de server, een<br />

“notify” interface te gebruiken die nodig is <strong>voor</strong> de server, waarin de functie aanroepen staan naar<br />

de client. In Koala is dit volkomen symmetrisch opgelost. Callback is een functie aanroep via de<br />

notify interface. Merk op dat callback iets anders is dan een notificatie, want het initiatief van de<br />

notificatie ligt bij de server, de server notificeert spontaan, en niet als uitgesteld antwoord op een<br />

request.<br />

1.4.9 MIPS recovery<br />

Als de MIPS crasht blijkt dat de transformatie laag gewoon autonoom doorwerkt, onder het motto<br />

“managers, waar<strong>voor</strong> heb je ze nodig”. Er is een reboot methode bedacht om de MIPS weer op te<br />

starten, zonder onderbreking van de transformatie laag. Daartoe wordt regelmatig de status<br />

weggeschreven naar NVM (Non Volatile Memory). Bij het opstarten <strong>voor</strong> recovery wordt het<br />

schrijven naar hardware registers of het commanderen van de TriMedia componenten<br />

tegengehouden, zodat de transformatie laag blijft werken. De status opvragen van de transformatie<br />

laag blijft wel mogelijk, dat moet zelfs. Deze modus wordt aangehouden totdat de MIPS weer bij de<br />

tijd is. Zo'n situatie zou zich niet <strong>voor</strong> moeten doen, maar helaas is er een een TV in de markt<br />

geweest die dit in het begin regelmatig deed. Tijdens de crash reageerde de TV niet op opdrachten<br />

met de afstandsbediening, of op de toetsen op televisie. Dit werd doorgaans gemerkt door de<br />

gebruiker, want de crash was meestal een – verkeerde – reactie op een signaal van de<br />

afstandsbediening, waarna de gebruiker extra hard en vaak, maar wel te vergeefs, op knoppen<br />

drukte om te TV te laten doen wat hij wou. Tegen de tijd dat de TV weer reageerde drukte de<br />

gebruiker vaak op willekeurige toetsen, waarna de TV ook niet deed wat hij wilde.<br />

Pagina: 40 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

1.4.10 Test binaries<br />

Tijdens ontwikkeling worden niet alleen binaries gemaakt <strong>voor</strong> het product zoals dat uiteindelijk in<br />

de tv komt, er is een binary <strong>voor</strong> het audio/video platform, veel componenten in het platform<br />

worden getest met het platform harness, omdat hiermee de interfaces naar en van het platform<br />

kunnen worden gekoppeld aan een script, of kunnen worden gebruikt via een menu op de tv. Veel<br />

interfaces zijn vast verbonden met een component, daarom kun je er vrij eenvoudig een component<br />

mee testen. Dan zijn er nog binaries die een test-harnas zijn van een enkele component of een<br />

enkele source module, en die mogelijk op een desktop of laptop getest kunnen worden: de unit tests.<br />

Er zijn in principe twee methoden om software te laden en op te starten in een TV. Je kunt software<br />

uploaden naar het flash geheugen van de TV en dan <strong>voor</strong>taan van daaruit starten. Upload gebeurt<br />

met met het installatie tool. Er is ook een methode om software van een externe source rechtstreeks<br />

te laden in het main memory van de TV. Beide methoden worden gebruikt. De laatste methode<br />

wordt bij<strong>voor</strong>beeld gebruikt door remote debuggers. Zolang software getest wordt zijn er dus twee<br />

methoden om de TV te starten: wel of niet uit flash memory.<br />

Zoals eerder vermeld, is er een tijd geweest dat we werkten met component tests op de televisie,<br />

waarbij iedere component was ingebed in zijn eigen executable: het test-skeleton. Deze methode<br />

bleek dermate onderhoudsgevoelig dat we ermee zijn gestopt. Een belangrijk deel van onze<br />

component tests worden uitgevoerd in één executable: het platform test-harness. Slechts enkele tests<br />

worden uitgevoerd op de PC, in een eigen test-harness, <strong>voor</strong> tests die uitgevoerd kunnen worden<br />

zonder TV hardware.<br />

1.4.11 Tools<br />

Behalve de software die moet worden uitgevoerd in een televisie, zijn er nog allerlei tools.<br />

● Koala en de MIDL zijn reeds genoemd.<br />

● Voor elk van de 3 soorten processors is er een C cross compiler/linker, in ieder geval<br />

<strong>voor</strong> <strong>voor</strong> de MIPS is er een debugger. Ook wordt gebruik gemaakt van een native<br />

compiler op de desktop of laptop, om componenten te testen en <strong>voor</strong> de tools die lokaal<br />

draaien. Verder wordt er gebruik gemaakt van een aantal script talen zoals perl.<br />

● Er is software gebruikt om C files te <strong>control</strong>eren op foute constructies, en overtredingen<br />

van coderingsregels. De static analyser die ik heb meegemaakt was QA-C.<br />

● Er is een flow-charter <strong>voor</strong> het tekenen van structuur diagrammen (Microsoft visio)<br />

● Er is software om vanaf een PC de registers in de TV te lezen en te schrijven.<br />

● Er is een installatie tool om de software op de tv te installeren en te onderhouden, en<br />

een script op de PC om deze software te verzamelen.<br />

● De software op de TriMedia's wordt uitgevlooid en getest met hulp van softwareinstrumentatie.<br />

Om het realtime ritme te handhaven print men niet méér dan <strong>voor</strong> de<br />

analyse noodzakelijk is, en past men een compressie techniek toe op de gegevens die<br />

gelogd worden. Hier<strong>voor</strong> wordt gebruik gemaakt van een pre-compiler op de PC, en<br />

een tool dat binaire nummers in de log-file vervangt door tekststrings, en het resultaat<br />

converteert naar een excel file.<br />

● Er is capture software om gegevens uit de audio en video stromen zichtbaar te maken<br />

● Er is een tool om een test-harness te genereren bij een Koala component. Vanaf een PC<br />

kan men dank zij RPC toegang krijgen tot een component die draait op de MIPS via<br />

Pagina: 41 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

een koala of com interface. Het generatie tool genereert stubs <strong>voor</strong> de MIPS software,<br />

en symbol files <strong>voor</strong> een programma op de PC dat test-scripts kan uitvoeren, en een<br />

testrapport genereert. Het generatie tool genereert ook menu's om interface functies aan<br />

te roepen met behulp van de afstandsbediening.<br />

● Er is een programma op de PC dat het NVM (non volatile memory) kan lezen en<br />

schrijven<br />

● Time-doctor wordt gebruikt.<br />

● Er is software <strong>voor</strong> het specificeren van gebruikers menu's.<br />

● Er is software om remote <strong>control</strong>s aan te sturen vanaf een PC. Er is software om vanaf<br />

een PC pattern generators aan te sturen e.d.<br />

● Waarschijnlijk ben ik niet volledig.<br />

Veel van deze programmatuur wordt verstrekt door derden, sommige tools zijn home-made van<br />

NXP, en sommige zijn home-made van onze klant. Vaak is er een overlap van programma's die<br />

gemaakt waren <strong>voor</strong> persoonlijk gebruik, en later tot handig tool <strong>voor</strong> allen werden verordend. Ook<br />

is er overlap omdat een klant een eigen programma hanteert en NXP ook een tool beschikbaar stelt.<br />

Soms gebruiken de hardware ontwerpers andere gereedschappen dan de software ontwerpers.<br />

In de praktijk kan men zich niet altijd houden aan zijn eigen methode en gereedschappen.<br />

Bij<strong>voor</strong>beeld bij een probleembeschrijving hoort een beschrijving van het scenario dat leidt tot het<br />

probleem, en een beschrijving van het waargenomen fenomeen. Deze beschrijvingen refereren aan<br />

de gebruikte gereedschappen, hun invoer en hun uitvoer. De ontdekker van het probleem en de<br />

oplosser moeten allebei het gebruikte gereedschap kennen.<br />

1.4.12 Version <strong>control</strong><br />

Momenteel (2004-2008) wordt binnen NXP een Version Control system (Continuous /<br />

Synergy) ter beschikking gesteld, waarin voldoende software is opgenomen <strong>voor</strong> een platform<br />

build. Software <strong>voor</strong> een product build wordt beschikbaar gesteld in een folder op een shared disk.<br />

Hier worden door de build manager recente generaties bijgehouden, compleet met product binaries<br />

(executables). Dit betreft zowel optimized binaries als ook debug binaries, en een tussenvorm<br />

waarin slechts ingebouwde “asserts” worden getest. In deze product info-trees mag je niet wijzigen,<br />

als je wilt wijzigen dan moet je een lokale kopie maken. Met deze constructie hoopt men de<br />

synchronisatie-tijd en de build tijd <strong>voor</strong> ontwikkelaars enigszins te reduceren. Koala doorzoekt de<br />

gehele folder tree tijdens een build, hoe kleiner de tree hoe sneller de build, vandaar dat de folder<br />

structuur in het <strong>revision</strong> <strong>control</strong> system getrimd is <strong>voor</strong> platform (test harness) builds.<br />

Ieder team heeft zijn eigen centrale <strong>revision</strong> <strong>control</strong> systeem, Daarin komen alle benodigde<br />

packages, ook die van andere teams. In ieder package is ieder project een branch. Zo is er ook in<br />

iedere folder en iedere file een branch per project. De baselines van packages van andere teams<br />

worden overgenomen met behulp van DCM (distributed configuration management), en het eigen<br />

package wordt verstuurd met behulp van DCM. Iedere branch kan subbranches hebben die later<br />

weer met elkaar vergroeien tot main-branch, als de versions van de tips gemixt worden tot een<br />

resulterende version. Package versions en folder versions bevatten een set elementen. Als de set<br />

veranderd wordt een nieuwe version gemaakt van de folder.<br />

Pagina: 42 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

1.4.13 Instrumentation<br />

Vlak <strong>voor</strong> ik met pensioen ging werd een ontwikkel-omgeving gepresenteerd <strong>voor</strong> MIPS software,<br />

Pagina: 43 / 230<br />

main.c sub1.c sub2.c<br />

#include <br />

#include <br />

extern void fsub1(void);<br />

extern void fsub2(void);<br />

int main(int argc, char *argv[])<br />

{<br />

int i;<br />

/* normally an endless loop */<br />

for (i=0; i build product,optimize<br />

•••<br />

•••<br />

••• successfully •••<br />

C:> touch sub1.c<br />

•••<br />

•••<br />

••• successfully •••<br />

C:> build product,optimize,ENABLE_PRINT<br />

•••<br />

•••<br />

••• successfully •••<br />

C:><br />

Een manier om sub1.c te laten loggen.<br />

#include <br />

#ifdef ENABLE_PRINT<br />

#define PRINT(p) printf p<br />

#else<br />

#define PRINT(p)<br />

#endif<br />

void fsub2(void)<br />

{<br />

static int c=2;<br />

static int d=3;<br />

/* obtain c */<br />

c++;<br />

PRINT (("c = %d\n",c));<br />

/* obtain d */<br />

d++;<br />

PRINT (("d = %d\n",d));<br />

}<br />

main.c sub1.c sub2.c<br />

#include <br />

#include <br />

extern void fsub1(void);<br />

extern void fsub2(void);<br />

int main(int argc, char *argv[])<br />

{<br />

int i;<br />

/* normally an endless loop */<br />

for (i=0; i


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

waarin een debugger ontbrak. Later werd GDB gepresenteerd als debugger. Deze debugger is<br />

beschreven in een erg dik handboek, en er was een half A4-tje waarin werd uitgelegd hoe je vanaf<br />

een PC software in een televisie kon debuggen. Inmiddels werd op grote schaal gebruik gemaakt<br />

van logging (instrumentatie), dat <strong>voor</strong> de TriMedia software reeds standaard was. Ondertussen<br />

waren de <strong>voor</strong>delen ontdekt: test-werkplekken kunnen beter gedeeld worden met kort lopende<br />

sessies waarin gegevens in een log-file geplaatst worden. Sessies met een debugger houden een testwerkplek<br />

langdurig bezet. De debugger werd slechts zelden gebruikt. Er zijn wel regels <strong>voor</strong> het<br />

wel of niet gebruiken van instrumentation. Nadat je het hebt gebruikt <strong>voor</strong> debugging moet je de<br />

logging uitschakelen, en verifiëren of de software zonder logging correct is. De software moet<br />

worden overgedragen, zonder werkende logging.<br />

Dit laatste is niet helemaal waar. Sommige boodschappen werden geacht nuttig te zijn <strong>voor</strong> allen, of<br />

in ieder geval velen. Er is daarom een categorie console messages die getoond worden in “assert”<br />

mode, maar de gewone console messages worden adhoc ingebouwd of naar behoefte geactiveerd.<br />

Instrumentatie wordt gebruikt <strong>voor</strong> een aantal redenen. Zonder garantie dat de redenen uitputtend<br />

zijn opgesomd geef ik de volgende:<br />

<strong>control</strong>e op volledigheid bij het testen (coverage)<br />

frequentie meting en doorlooptijd-tijd meting ten behoeve van tijd optimalisatie<br />

loggen ten behoeve van debugging en testen (white-box tests)<br />

signaleren van overtreding van preconditions, postconditions en invariants, met behulp van “assert”<br />

Alleen om de laatste twee redenen wordt instrumentatie gebruikt in de MIPS software. Logging en<br />

assert zijn rechttoe rechtaan “met de hand” ingebouwd, zonder generator, of aspect oriented<br />

programming.<br />

1.4.14 Slot opmerkingen<br />

Alles stroomt<br />

Wat opvalt is dat er veel verhuisd en geherstructureerd kan worden:<br />

Er wordt verhuisd tussen besturingsniveau en transformatie niveau (wel/niet delegeren)<br />

Oplossingen verhuizen van Koala componenten naar COM componenten<br />

Het binden van diversity parameters worden verhuisd van compilatie-tijd naar uitvoerings-tijd visa<br />

versa<br />

Er wordt verhuisd in de folder en package structuur<br />

Executie wordt verhuisd van de éne prioriteit naar de andere<br />

Een oplossing kan zelfs worden verhuisd van uitvoerings-tijd naar ontwerp-tijd of omgekeerd.<br />

Er wordt waarschijnlijk veel tijd aan herstructureren en verhuizen besteed, ik weet niet goed hoe je<br />

het kunt vermijden, maar ik weet wel dat dit werk is dat niet direct leidt tot <strong>voor</strong>uitgang.<br />

Waarschijnlijk is het werk dat bijdraagt aan de perioden waarin niets lijkt te gebeuren in<br />

“Weinberg's Law of Twins”. Echte <strong>voor</strong>tgang, dat zijn de krenten in de pap, maar de krenten kunnen<br />

de pap niet missen. Wil je dat meer progressie zich manifesteert, dan zou je dat misschien kunnen<br />

bereiken door het verhuizen en herstructureren te beperken of te verbieden. Maar de structuren die<br />

er zijn worden dan misschien een keurslijf, waar nogal wat work-around overheen puilt, zoals<br />

bij<strong>voor</strong>beeld met Horcom is gebeurd. Let wel, vaak is er eerst de work-around, en dan pas het<br />

inzicht dat herstructureren misschien beter zou zijn geweest. Daarna kan er pas geïnventariseerd en<br />

beslist worden over opnieuw doen. In actuele situaties geldt vaak: “het zit er al in en het werkt”.<br />

Pagina: 44 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

Maar bij een nieuw project zou je elke keer kunnen beginnen met het opruimen van enkele uit de<br />

hand gelopen constructies.<br />

Door te herstructureren ben je bezig met de stuff en blijf of ga je de problematiek beheersen. Net als<br />

koffie drinken, kletsen met een collega, en opruimen, kun je het doen, als je het even niet ziet zitten<br />

of een beslissing wilt uitstellen. Sommige mensen zeggen dat mensen herstructureren om een stukje<br />

van zichzelf vast te leggen in hun omgeving, of in ieder geval om de omgeving naar hun hand te<br />

zetten, zodat ze zich er thuis voelen. Als de law of twins geldt, dan heb je herstructureren nodig om<br />

op een gegeven moment door te stoten, en is het te vergelijken met (lang) mikken <strong>voor</strong>dat je schiet.<br />

“Weinberg's Law of Twins”: eigenlijk geldt hier: Wie een parel wil zien moet er zelf maar naar<br />

duiken. Maar ik zal toch maar een referentie geven. Ik vond de wet in Wikipedia (Engels). De<br />

verwijzing die daar bij staat: “Weinberg, Gerald M. The Secrets of Consulting: A Guide to Giving<br />

and Getting Advice Successfully, Dorset House Publishing Company, 1986. ISBN 0-932633-01-3"<br />

Grenzen van een <strong>revision</strong> <strong>control</strong> system<br />

Versies van files, die direct of indirect uit elkaar <strong>voor</strong>komen vormen in een klassiek RCS een DAG<br />

(Directed Acyclic Graph) Er is de aanname dat de versies ervan op een gestandaardiseerde manier<br />

elkaars wijzigingen kunnen overnemen (met een merge programma), en dat zo wijzigingen in de<br />

éne branch gemakkelijk kunnen worden overgenomen in een andere. NXP rekt dit idee op en<br />

veronderstel dat wijzigingen in het ene lid van een product familie op gestandaardiseerde manier<br />

kunnen worden overgenomen in een ander. Maar het zou kunnen dat er zoveel is gewijzigd tussen<br />

producten (zie ook het <strong>voor</strong>gaande: “alles stroomt”) dat dit niet meer volledig opgaat. De praktijk<br />

moet uitwijzen of er nog een zinvol deel overblijft <strong>voor</strong> de gestandaardiseerde<br />

gegevensuitwisseling. In het verleden bleek vaak dat dergelijke uitwisseling zinvol is tussen redelijk<br />

verwante leden, en dat uitwisseling zinvol is tussen dat deel van de code dat nauwelijks gewijzigd<br />

is.<br />

In het <strong>voor</strong>gaande: “alles stroomt” worden ontwikkelingen geschetst waarvan de herstructurering<br />

niet vastligt in de structuur van een version of <strong>revision</strong> <strong>control</strong> system. Al zijn de resultaten van<br />

dergelijke ontwikkelingen wel over te dragen met standaard merge, copy en delete, toch herken je<br />

de herstructureringen meestal niet door puur naar de ontwikkeling van een branch te kijken. Alleen<br />

naamswijzigingen en verplaatsingen in de folder structuur worden immers geregistreerd als<br />

herstructureringen.<br />

Ontwikkel methoden<br />

Bij NXP waren ontwikkelmethoden een beetje een verwaarloosd. Voor je met coderen begint<br />

moeten de interfaces beschreven zijn en moet er een component description zijn. Deze<br />

beschrijvingen zijn echter meer implementatie en gebruikers handleidingen dan ontwerp<br />

documenten. In het begin moest er een Visio plaatje (schema) gemaakt worden van een component,<br />

later werd het plaatje gegenereerd uit de cd file. Er is geen <strong>voor</strong>schrift om een ontwikkel traject te<br />

doorlopen dat eindigt met de juiste componenten en interface structuur. Het enige dat er is is een<br />

plaatje met blokken: applicaties, middleware, operating, platform en dergelijke en heel misschien<br />

een aanduiding waar de clients zitten waar de servers ervan. Niet echt refutable stuff, meer een<br />

hoofdstuk indeling.<br />

Dit haalde het niet bij de stappen (acht of zo) in ORM, die allen een model opleveren. En ook niet<br />

bij de UML schema's waarmee fasen en facetten van het object georiënteerd ontwerpen worden<br />

beschreven. Al evenmin bij de tweedeling probleem beschrijving en probleem oplossing bij de<br />

Pagina: 45 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

"problem frames"van Michael Jackson. Nu we leven in een tijdperk van hergebruik en onderhoud<br />

van het bestaande is het mogelijk lastig om te spreken over ontwikkelfasen, en beter om te spreken<br />

over een aantal modellen die je bijhoudt. Misschien doe je dat per project toch ongeveer in een<br />

bepaalde volgorde.<br />

Zonder echte ontwikkel methoden, begin je misschien al te snel te programmeren als je een idee<br />

hebt of de weg ziet naar een oplossing. Methodiek zou het idee moeten vervolmaken, integreren,<br />

mogelijk weerleggen, herstructureren, of weer ideeën uitlokken. Een methode is de transpiratie na<br />

de inspiratie.<br />

Aangezien de werkwijze van NXP leidend is bij mijn ontwerp van een <strong>revision</strong> <strong>control</strong> systeem is<br />

de invloed van het volgen van een ontwikkelmethode minimaal. Toch stel ik mij <strong>voor</strong> dat<br />

hergebruik in product families leidt tot kleine reeksen bewerkingen van model onderdelen. Op zijn<br />

simpelst: eerst wijzig je een schema, dan een document, dan een testscript, en dan een source<br />

module. Op enig moment is een deel van zo'n ontwikkelreeksje klaar, en is er een rest deel te gaan.<br />

Omdat oplossingen ontstaan in wisselwerking tussen kennis “intern in het hoofd” en ”extern in de<br />

modellen”, is de volgorde waarin de (extern buiten het hoofd) modellen worden bijgewerkt<br />

boterzacht. Bovendien zijn er allerlei confrontaties (in gebruik nemen, reviews, tests) die tot<br />

volgorde afwijkingen kunnen leiden. De toestand van zo'n reeks wordt bepaald door wat is<br />

afgevinkt als klaar, en dat is niet altijd aaneengesloten, en startend met de eerste volgens de formele<br />

volgorde. De toestand van het product wordt dan bepaald door de toestanden van de reeksjes.<br />

Alleen al door te spreken over “de toestand van het product” lijkt dit een onderdeel van<br />

configuration management, en zou je na moeten gaan wat de bijdrage van een version <strong>control</strong><br />

system zou kunnen zijn. Maar niet in dit schrijfsel dus: mijn werk bij NXP leverde onvoldoende<br />

use-cases. Vaak werden document, source code en testscript gezamenlijk gewijzigd en<br />

overgedragen. Alleen bij echte nieuwbouw was sprake van acceptatie procedures met min of meer<br />

harde volgorden.<br />

Het idee van de wisselwerking tussen kennis in het hoofd en kennis in de wereld vond ik in de<br />

Nederlandse versie van: “Donald Norman, “The Psychology of Everyday Things”, vertaling: Prof.<br />

dr. A.J.W.M Thomassen, Dictatuur van het design, A.W. Bruna Uitgevers B.V. Utrecht, 1990 ISBN<br />

90 229 7907 5<br />

Een <strong>voor</strong>beeld. Een uiterst simpel fictief ontwikkelingsmodel. Er moet een flow diagram ontwikkeld<br />

worden. De drie ontwikkel fasen zijn: eerst bepaal je de blokken, dan de verbindingslijnen, en<br />

tenslotte de teksten. Tijdens een nieuwe ontwikkeling wordt strikt volgens deze methode gewerkt. In<br />

de repository zie je dan ook eerst versies met alleen blokken, dan is er een mijlpaal, (een “hoera<br />

snapshot” zeg maar), en daarna komen er versies met blokken en lijnen, en tenslotte komen er<br />

versies waarin ook teksten staan. De diagram versies die gemarkeerd zijn met een mijlpaal worden<br />

als waardevolle modellen beschouwd, met bestaansrecht vanwege de informatie die ze<br />

benadrukken.<br />

Reeds in de tweede fase, als er lijnen getrokken worden zie je dat soms blokken verschijnen,<br />

verdwijnen, of verplaatst worden, en in de derde fase kunnen er ook correcties optreden op blokken<br />

en lijnen. En tenslotte wordt er onderhoud gepleegd op het uiteindelijke resultaat, met wijzigingen<br />

op alle ingrediënten. Een “reversed engineering” tool zorgt er<strong>voor</strong> dat uit een volledige versie een<br />

model met uitsluitend blokken, en een model met blokken en lijnen gemaakt wordt. De modellen die<br />

Pagina: 46 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.4 Televisie, de software<br />

gemaakt worden met het reversed engineering tool zijn geen “source code”. In een source code<br />

<strong>revision</strong> <strong>control</strong> systeem horen ze strikt genomen niet <strong>voor</strong> te komen. Up-to-date zijn daarin dus op<br />

een gegeven moment uitsluitend volledige schema's, en verouderd zijn daarin de schema's met<br />

alleen blokken, en de schema's met blokken en lijnen. Zelfs als je de reversed engineering modellen<br />

opneemt in de repository dan zijn het versies van een andere file dan de source file. Eigenlijk zijn<br />

de blokken modellen ook geen versies van elkaar, omdat ze niet door update uit elkaar <strong>voor</strong>tkomen.<br />

Je zou ze in de repository willen plaatsen zodat ze beschikbaar zijn <strong>voor</strong> mensen die niet over het<br />

tool beschikken, bij<strong>voor</strong>beeld omdat ze in een ander team werken.<br />

Conclusie: <strong>voor</strong> een volledige verzameling use-cases <strong>voor</strong> een repository zou je een aantal<br />

ontwikkel- en onderhouds- methoden moeten beschouwen.<br />

Use-cases die <strong>voor</strong>tkomen uit ontwikkel methoden zullen soms leiden tot een regel <strong>voor</strong> het gebruik<br />

van een repository, soms tot een requirement <strong>voor</strong> de repository, en soms tot een verzoek tot<br />

aanpassing van de tools van de ontwikkel methode. Het bovenstaande leidt bij<strong>voor</strong>beeld tot de<br />

regel: Zodra een mijlpaal is gepasseerd pas je reversed engineering toe en plaatst het resultaat in<br />

een nieuwe file in de repository. Het wordt van die file de eerste versie. Een requirement <strong>voor</strong> de<br />

repository: files die geen source file zijn moeten gefaciliteerd worden. Een <strong>voor</strong>stel om details van<br />

een ontwikkelmethode aan te passen: zie het volgende <strong>voor</strong>beeld.<br />

Een tweede <strong>voor</strong>beeld. In de jaren negentig heb ik gewerkt met een IDE <strong>voor</strong> het maken van C<br />

code. Deze IDE bevatte een “wizard” <strong>voor</strong> het generen van initiële C source code <strong>voor</strong> een aantal<br />

soorten applicaties. Er zijn bij<strong>voor</strong>beeld DOS command line applicaties, ActiveX applicaties, MFC<br />

applicaties COM applicaties en dergelijke. De wizard leidt je door een menu en genereert dan een<br />

aantal files met initiële code. Deze files bevatten vaak een “comment” regel waarin iets staat als<br />

“insert here your code:”. Het hele gegenereerde kun je beschouwen als source code. Op een<br />

gegeven moment ontdekte ik dat je het process kunt herhalen, zelfs als je eigen code al hebt<br />

ingevuld, en je de applicatie hebt uitgebreid met allerhande eigen files. Bij dit herhalen kun je<br />

andere opties en waarden opgeven: je kunt ze onderhouden. Blijkbaar worden de oorspronkelijke<br />

menu keuzen en velden in de wizard met reversed engineering gereconstrueerd uit de gegenereerde<br />

code, zodat je het menu kunt aanpassen, waarna opnieuw initiële code wordt gegenereerd, die<br />

daarna in het geheel de oorspronkelijk gegenereerde code vervangt. Bij bepaalde soorten<br />

applicaties was het genereren ook nog eens modulair, en complex: bij<strong>voor</strong>beeld <strong>voor</strong> elk menu kon<br />

je de wizard aanroepen, of <strong>voor</strong> elk window.<br />

Als je daar met mijn ogen naar kijkt, en misschien ook als je ernaar kijkt met de ogen van een<br />

configuration manager, dan kom je tot het volgende: de keuzen en de ingevulde velden in de menu's<br />

van de wizard zijn samen de source code. Deze code zou je liefst sec willen opslaan in de repository<br />

in één of meer files, en eventueel terug halen in de wizard <strong>voor</strong> bewerking. Door ze in source files<br />

op te nemen zijn de opgegeven keuzen en waarden “identificeerbaar” geworden. De gegenereerde<br />

files zijn geen source en moeten liefst niet gemengd worden met source code. Dus geen comment:<br />

“/* plaats hier uw code: */” maar in plaats daarvan “#include ”. Dit zijn typisch<br />

aanpassingen in de details van deze minimale? “ontwikkelmethode”.<br />

Onder omstandigheden wil je misschien het genereren uitstellen en daar een build procedure <strong>voor</strong><br />

gebruiken, in plaats van de instant generatie van de wizard.<br />

Het zal <strong>voor</strong>stelbaar zijn dat het wijzigingen van de parameters en opties dikwijls geen<br />

“standalone” wijzigingen zijn, vaak moet ook de eigen code aangepast worden.<br />

Pagina: 47 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.5 Televisie, de hardware<br />

1.5 Televisie, de hardware<br />

Voor ons bestaat een televisie uit een kabinet, met daarin een LCD of plasma scherm met<br />

toebehoren, een voeding, een infrarood oog, en een paar luidsprekers, en uit een PCB (printed<br />

circuit board), soms twee PCB-'s, en een enkele keer drie. Het main-board bevat de tv chip van<br />

NXP, een tuner, een channel decoder, flash memory, (onverslijtbaar) NVM, chips van klanten, in -<br />

en uitvoer pluggen, een houder <strong>voor</strong> een CI-card enzo<strong>voor</strong>t. Het tweede board bevat pluggen <strong>voor</strong><br />

de zijkant of de <strong>voor</strong>kant van de TV. Zelden wordt er door een klant gebruik gemaakt van een “bolton”<br />

board, met extra hardware. Het kan gebeuren dat een main-board combineerbaar is met<br />

meerdere side-boards, of een side-board met meerdere main-boards. Bij een boardset horen<br />

uiteraard connectors en kabels om de boards onderling te verbinden, en om ze te verbinden met het<br />

kabinet.<br />

Zo'n board of boardset is een reference boardset als het gemaakt is door NXP of een design-in<br />

boardset als het gemaakt is door een klant.<br />

De boardset is vaak combineerbaar met meer dan één type kabinet, en een kabinet is vaak<br />

combineerbaar met meer dan één type boardset.<br />

Soms moet er geïmproviseerd worden: dan wordt er bij<strong>voor</strong>beeld een externe voeding gebruikt om<br />

de boardset van stroom te <strong>voor</strong>zien, of de uarts moeten elektrisch compatibel gemaakt worden met<br />

de com poorten van de PC.<br />

Sommige boards zijn niet volledig uitgevoerd, er missen pluggen, of sommige verbindingen staan<br />

niet op het board. Zo'n board is dan slechts bruikbaar <strong>voor</strong> een deel van de software tests. Af en toe<br />

kan het hardware team de functionaliteit van zo'n board uitbreiden.<br />

De chips op de boards hebben een versie nummer. Tijdens de duur van een project kan worden<br />

overgegaan naar een boardset met verbeterde chips, of naar een verbeterde boardset. “Software<br />

Diversity” wordt gebruikt om de overgang mogelijk te maken. De “workarounds” <strong>voor</strong> de oude<br />

versie kun je dan met diversity uitschakelen <strong>voor</strong> de nieuwe versie van de boardset.<br />

Soms als een project net is opgestart, en er nog geen eigen design-in boardset beschikbaar is,<br />

behelpt men zich met een boardset die er op lijkt.<br />

Het is zo dat adequate hardware niet altijd beschikbaar is op het moment dat software ontwikkeld<br />

wordt. Vaak worden tests dan uitgesteld tot een later stadium. Dan bestaat het team vaak uit minder<br />

software ontwikkelaars (vaak ook anderen), en meer testers.<br />

Invoer en uitvoer pluggen van een boardset:<br />

● Antenne (invoer)<br />

● Scart (invoer/uitvoer analoog video en audio, meestal 2 of drie, op een Europese tv)<br />

● Cvbs cinch (één <strong>voor</strong> invoer, één <strong>voor</strong> uitvoer analoog video)<br />

● Yc S-VHS connector (één <strong>voor</strong> invoer en één uitvoer analoog video)<br />

● sound left/right cinches (enkele <strong>voor</strong> invoer , één <strong>voor</strong> uitvoer analoog audio)<br />

● analoog mono sound input<br />

Pagina: 48 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.5 Televisie, de hardware<br />

● headphone plug (uitvoer analoog audio <strong>voor</strong> koptelefoon)<br />

● YpbPr of RGB cinches (één of twee sets invoer analoog video YPbPr: 3 cinches, RGB 5<br />

cinches)<br />

● VGA (invoer analoog RGB signaal, PC monitor signaal)<br />

● Spdif (één of twee invoer één uitvoer digitaal audio niet gecomprimeerd, soms extra een<br />

optische invoer of uitvoer)<br />

● Hdmi (meerdere invoer digitaal audio en video niet gecomprimeerd)<br />

● Dvi (invoer digitaal video niet gecomprimeerd, PC monitor signaal)<br />

● Usb (invoer digitaal audio, foto, video, gecomprimeerd. Ook wordt usb gebruikt <strong>voor</strong><br />

programmatuur die door installatie tool wordt geïnstalleerd op flash memory)<br />

● Ethernet (Interactieve communicatie, mail, digitaal audio, foto, video, gecomprimeerd,<br />

enzo<strong>voor</strong>t)<br />

● Houder <strong>voor</strong> een CI (common interface) cartridge waarmee een abonnement op pay-tv<br />

stations kan worden gerealiseerd.<br />

● UART (een van de uarts wordt gebruikt om de standby processor te programmeren, de<br />

andere om een console verbinding met de MIPS te realiseren)<br />

● JTAG (deze invoer/uitvoer is verbonden met een probe die via het local area netwerk is<br />

verbonden met een PC. Via JTAG kan logging informatie van MIPS en TriMedia naar een<br />

PC worden gestuurd, kan programmatuur worden geladen in MIPS of TriMedia, worden<br />

registers gelezen of geschreven, wordt geheugen bekeken of gewijzigd, breakpoints gezet of<br />

verwijderd, en dergelijke.<br />

● Connector infrarood sensor (afstandsbediening)<br />

● Connector <strong>voor</strong> aansturen scherm<br />

● Connector <strong>voor</strong> aansturen speakers<br />

● Connector <strong>voor</strong> voeding<br />

● Optionele overige aansluitingen bij<strong>voor</strong>beeld: microfoon <strong>voor</strong> speech-<strong>control</strong>, zendertje om<br />

de remote <strong>control</strong> te laten piepen, en dergelijke<br />

Pagina: 49 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.6 De testplek<br />

1.6 De testplek<br />

In een laboratorium staan lab-tafels. Dat zijn tafels met een extra schap, een transformator als<br />

elektrische isolatie, een zekering, een hoofdschakelaar, een aard-lek schakelaar, veel stopcontacten,<br />

en een aard-strip. Deze zijn ingericht als test-plekken. Meestal is een lab-tafel groot genoeg <strong>voor</strong><br />

twee plekken. Zo'n test-plek bevat een televisie <strong>voor</strong> het testen van software. Bij iedere televisie<br />

hoort een probe, die bedoeld is om van buiten af geheugens en registers in de televisie te lezen en te<br />

wijzigen. Behalve de tv is er een desktopcomputer, die met zijn com poorten is verbonden met de<br />

uarts en met de probe, en mogelijk nog met een signaal generator die te bedienen is met behulp van<br />

een (test) script vanaf de desktop. Ik zal de computers op de testplek "desktop" noemen om ze te<br />

onderscheiden van "personal" computers, wat dan weer laptops of desktops kunnen zijn. Testplek<br />

desktops zijn allemansvriendjes, waar Ms-Windows op draait.<br />

Desktop en probe zijn ook verbonden via het intranet; het IP adres van de probe kan worden<br />

gelezen via een com poort. De probe is verbonden met de JTAG plug van de tv.<br />

De test desktop bevat veel gespecialiseerde tools die normaal niet op een bureau PC aanwezig zijn:<br />

een debugger, een tool om het NVM te lezen of te schrijven, om registers te lezen of te schrijven,<br />

om test scripts uit te voeren, om programma's en configuratie files over te brengen naar de tv,<br />

drivers <strong>voor</strong> afstandsbediening en <strong>voor</strong> patroon generators die aangestuurd worden via com poorten<br />

of USB en dergelijke.<br />

Er staan DVD spelers, die verbonden zijn met invoer pluggen, en een kleine analoge tv die<br />

verbonden is met een analoge uitvoer-plug van de tv. Op sommige tafels staat een home cinema set,<br />

die verbonden is met de spdif uitvoer. De antenne plug is verbonden met één van de interne<br />

televisie-netwerken van het laboratorium, met een patroon-generator, of met een mobiel tv<br />

stationnetje, dat analoog of digitaal uitzendt. Andere invoer pluggen zijn mogelijk ook verbonden<br />

met patroon-generators. Meestal is er een koptelefoon. Er zijn afstandsbedieningen <strong>voor</strong> de tv en de<br />

dvd spelers. Af en toe wordt een video recorder gebruikt, of is een canal-plus decoder verbonden<br />

met een scart. Er is een afstandsbediening op een voetstuk, die aangestuurd wordt via een<br />

com-poort van de desktop, en software die zo'n afstandsbediening aanstuurt. Incidenteel wordt een<br />

spelcomputer aangesloten, en soms is er een set met een settopbox.<br />

Vaak is er enige afscherming om te zorgen dat je elkaar niet stoort met een remote <strong>control</strong>.<br />

Kern van een werkplek zijn altijd de tv, de desktop, de probe, een dvd speler, een monitor, en twee<br />

afstandsbedieningen (één <strong>voor</strong> de tv en de monitor, en één <strong>voor</strong> de dvd speler). De andere<br />

apparatuur blijft korter of langer, al naar gelang de behoefte. Werkplekken die in gebruik zijn <strong>voor</strong><br />

dagelijkse testen en overdrachtstesten, hebben een grotere kern van randapparaten. Ook<br />

werkplekken die specifiek zijn opgezet <strong>voor</strong> audio tests hebben een grotere kern. Een werkplek<br />

blijft meestal <strong>voor</strong> langere tijd ingericht met dezelfde televisie.<br />

Vaak zijn test-werkplekken niet persoonsgebonden en vaak zijn ze ook niet taak gebonden. Ze<br />

worden gedeeld door testers en ontwikkelaars. Dikwijls werkt een persoon of een team <strong>voor</strong> meer<br />

dan één project, en heeft dan zeker te maken met meer dan één test-werkplek. Meestal zijn er<br />

diverse tv's nodig binnen één project, bij<strong>voor</strong>beeld om te testen met verschillende kabinetten, of<br />

verschillende boardsets.<br />

Soms is het niet nodig om beeld of geluid waarnemingen te doen, of om pluggen in en uit te<br />

Pagina: 50 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

1 Inleiding<br />

1.6 De testplek<br />

trekken, of apparaten aan en uit te zetten, een keuze menu te volgen op een dvd speler enzo<strong>voor</strong>t.<br />

Dan wordt een tool als VNC gebruikt om vanaf je bureau de test desktop over te nemen en een test<br />

uit te voeren. Ook wordt dit tool dikwijls gebruikt als iemand aan zijn bureau uitzicht heeft op de<br />

testplek, zodat beeld en geluid gewoon kunnen woeden waargenomen.<br />

Af en toe wordt er een opstelling gemaakt met een webcam zodat iemand werkelijk remote tests kan<br />

uitvoeren.<br />

Veel van de hulp-apparaten zijn “signaal generators”. Dit geldt bij<strong>voor</strong>beeld al <strong>voor</strong> de DVD<br />

spelers. Bij een signaal generator horen “signalen”, <strong>voor</strong> de DVD speler zijn die afkomstig van<br />

dvd's. Voor patroon generatoren zijn dit patronen. De eenvoudige patroon generatoren bevatten een<br />

ingebakken hoeveelheid patronen, maar de meeste zijn programmeerbaar. Tv zendertjes moeten iets<br />

uitzenden. Er is dan ook een uitgebreide collectie aan patroon bestanden en multimedia bestanden<br />

beschikbaar op enkele file servers, en er zwerft een uitgebreide collectie dvd's door de lab ruimtes.<br />

Toen ik er wegging was blu-ray sterk in opkomst en werd er nog nauwelijks met video recorders<br />

getest. Alleen als specifieke video recorder problemen moesten worden opgelost, zoals variabele<br />

lijn en beeld frequentie, werd de recorder uit de kast gehaald.<br />

Pagina: 51 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.1 De basis<br />

In de zeventiger en tachtiger jaren had ik toegang tot de ICT bibliotheek van Philips Eindhoven.<br />

Hier hadden ze een kopie-service, waarbij ze maandelijks een blad met uittreksels distribueerden<br />

van tijdschrift-artikelen. De artikelen die je interessant vond kon je aankruisen, waarna ze een kopie<br />

van het artikel toestuurden. Zo heb ik in die tijd een klein persoonlijk archief opgebouwd van<br />

tijdschrift artikelen.<br />

Eén van die artikelen was “Update Reconsidered” van Ben-Michael Schueler. (Gepubliceerd in<br />

“Architecture and Models in Database Management Systems” G.M. Nijssen, (ed.), North Holland<br />

Publishing Company, 1977). Hierin wordt een lans gebroken <strong>voor</strong> opslag methoden waarbij niets<br />

wordt weggegooid. De methode om een oude waarheid te vernietigen door deze te overschrijven<br />

door een nieuwe wordt “Aton update” genoemd, de methode om diskruimte opnieuw te gebruiken<br />

omdat de file die er stond niet meer interessant is wordt “Palimpsest” genoemd, en het per ongeluk<br />

kwijtraken van informatie “Alexandria update”. Wie niet beschikt over het artikel kan de oorsprong<br />

van deze benamingen toch wel achterhalen, denk ik. Al deze updates zijn fout, we zouden geen<br />

informatie mogen weggooien, of kwijtraken. Voor mij was dit artikel een eye opener. Maar het was<br />

ook een intellectuele uitdaging, die ik met een <strong>voor</strong>beeld niet tot een goed einde bracht. Dit<br />

schrijfsel is dus een herkansing.<br />

Recente artikelen over temporele databases zijn gemakkelijk te vinden dank zij Google; enkele<br />

gevonden namen: “Christian S. Jensen", "Richard T. Snodgrass", artikelen die ik ooit van hen las:<br />

“2 Semantics of Time-Varying Information”, “Introduction to temporal database research”. Hierin<br />

wordt onderscheid gemaakt tussen “valid time” en “transaction time”.<br />

Stel bij<strong>voor</strong>beeld dat ene Jansen leefde van 1933 tot 2003, dan is de periode 1933-2003 de “valid<br />

time”, die begrensd wordt door twee gebeurtenissen (events), één in 1933 en één in 2003. Zelf ben<br />

ik geboren in 1944. Stel nu dat ik in 1983 hoorde dat hij in 1930 geboren was, en in 1995 hoorde ik<br />

dat hij in 1933 geboren was, en in 2007 dat hij in 2003 overleden was. Nu is er een “transaction<br />

time” over de periode 1944-1983, één gedurende 1983-1995, en één gedurende 1995-2007, en één<br />

van 2007 tot heden, met gebeurtenissen in 1944,1983, 1995 en 2007. Dank zij het feit dat ik de hele<br />

situatie zelf bedacht heb, hebben we een totaal overzicht dat leidt tot het volgende: gedurende<br />

1944-1983 was mijn kennis nihil, in de periode 1983-1995 fout, daarna 1995-2003 correct, dan in<br />

2003-2007 verouderd, en tenslotte correct. Zonder totaal overzicht hebben we alleen de transacties:<br />

in plaats van 'fout' kunnen we achteraf zeggen 'vermoedelijk fout', en in plaats van 'correct' kunnen<br />

we slechts zeggen 'vermoedelijk correct'. Er kan altijd een transactie plaatsvinden die onze kennis<br />

omtrent het valid zijn aanpast.<br />

Onzekerheid of het <strong>revision</strong> <strong>control</strong> systeem actueel is, is er meestal niet, een transactie wijzigt<br />

zowel het <strong>revision</strong> <strong>control</strong> system (de werkelijkheid) als ook de kennis die het <strong>revision</strong> <strong>control</strong><br />

system over zichzelf heeft. Die kennis over zichzelf is dus best wel actueel. Tenminste, als de<br />

<strong>revision</strong> <strong>control</strong> software geen fouten bevat, de hardware betrouwbaar is, het geheel goed is<br />

Pagina: 52 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.1 De basis<br />

beveiligd, de administrator foutloos werkt enzo<strong>voor</strong>t.<br />

Wat verwacht ik van een <strong>revision</strong> <strong>control</strong> systeem?<br />

● Het <strong>revision</strong> <strong>control</strong> system is <strong>voor</strong>al nodig om gestructureerd samenwerken mogelijk te<br />

maken Als iemand iets beschikbaar stelt <strong>voor</strong> gebruik door een ander, dan moet een<br />

bepaalde kwaliteit gegarandeerd zijn. Er is dus software die voldoet aan een kwaliteitseis, en<br />

software die niet voldoet maar daar naar op weg is. In ieder stadium is er een gebruikersclub.<br />

Voor iedere club is er een reden om de software te gebruiken, en kunnen er regels zijn<br />

<strong>voor</strong> het gebruik. Voor al die software is er het <strong>revision</strong> <strong>control</strong> system.<br />

● Dan is het <strong>revision</strong> <strong>control</strong> system er ten behoeve van review, reconstructie van wat er is<br />

gebeurd, analyse en debugging: om de software op peil te houden of te verbeteren dus.<br />

● Verder <strong>voor</strong> (project) evaluaties en dergelijke. Om de werkwijzen te verbeteren dus, en<br />

misschien ook om verantwoording af te leggen betreffende werkwijze en product.<br />

● Tenslotte is er het opportunistische argument: je weet nooit waar het goed <strong>voor</strong> is.<br />

In ieder geval <strong>voor</strong> de laatste 3 items van de verwachting geldt dat het <strong>revision</strong> <strong>control</strong> system<br />

antwoord moet kunnen geven op wie wat waar wanneer vragen over de inhoud van de repository.<br />

Zo nauwgezet mogelijk moet alles vastgelegd worden.<br />

Gestructureerd samenwerken wat is dat? De belangrijkste <strong>voor</strong>waarde is dat er een taakverdeling<br />

mogelijk is, waarbij de taken min of meer onafhankelijk van elkaar worden uitgevoerd. Iemand<br />

maakt iets, draagt het over, en pas daarna kan een ander er kennis van nemen of het gebruiken, of er<br />

verder aan werken. Dit hoeft niet per se één persoon te zijn: een groepje personen maakt iets, …<br />

Voor zaken als overleg, brainstormen, over de schouder meekijken, met zijn drieën samen en<br />

tegelijk aan een document werken, biedt deze repository geen faciliteiten, en moet je zoeken naar<br />

andere middelen. Moderne web applicaties en elektronische hulpmiddelen kunnen helpen, als dit<br />

soort samenwerken nodig is tussen mensen die geografisch gescheiden zijn. Maar de bijdrage van<br />

het software archief is hier praktisch nihil.<br />

Veel version <strong>control</strong> of <strong>revision</strong> <strong>control</strong> systems zijn source code <strong>revision</strong> <strong>control</strong> systems. Ik zal<br />

proberen te komen tot een software <strong>revision</strong> <strong>control</strong> system, Het liefst een beetje in de richting van<br />

een software project <strong>revision</strong> <strong>control</strong> system.<br />

Allereerst is er een naam nodig <strong>voor</strong> de software die ik beschrijf. Zeker als ik toekom aan<br />

importeren en exporteren is het nodig om export naar een ander systeem te onderscheiden van<br />

export naar een systeem dat dezelfde software gebruikt.<br />

Software ontwikkelen is als het gezamenlijk beklimmen van een berg, je klimt een eindje en dan<br />

kan een ander de aangebrachte <strong>voor</strong>zieningen gebruiken, Zelf gebruik je de <strong>voor</strong>zieningen die<br />

anderen aanbrengen om weer een nieuw stukje te klimmen. Dit geldt <strong>voor</strong> medewerkers binnen een<br />

team en ook tussen de teams.<br />

Ik vond geen woord <strong>voor</strong> “klimmen in een bepaald verband”, en dus zal het <strong>voor</strong>lopige codewoord<br />

<strong>voor</strong> de SCM software zijn: “Klimverband”. Maar de termen die ik hanteer zijn Engels. Dan wordt<br />

dit “Climb-Connexion” of kortweg :”<strong>Climbexion</strong>”.<br />

Pagina: 53 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

2.2 Begrippen<br />

2.2.1 Basisstructuur<br />

Allereerst definiëren we een timestamp. In C en C++ is er een standaard functie<br />

time_t time(time_t *tp)<br />

Deze retourneert een datum/tijd variabele met een resolutie van één seconde. Dit is enigszins grof<br />

<strong>voor</strong> een event. We zullen deze functie inbedden in de functie climbexion_timestamp() die bij een<br />

aanroep een combinatie van een time en een sequence number retourneert, en die garandeert dat<br />

ofwel de time is verhoogd sinds de vorige aanroep en het en sequence number geïnitialiseerd,<br />

ofwel de time is (nog) steeds hetzelfde, maar het sequence number is verhoogd. In de <strong>voor</strong>beelden<br />

in dit hoofdstuk laat ik het sequence number weg. Soms zullen timestamps echter slechts bestaan<br />

zonder sequence number, bij<strong>voor</strong>beeld, de datum/tijd van de laatste wijziging van een file die door<br />

desktop software is gewijzigd. Bij gebruik van zo'n timestamp kan <strong>Climbexion</strong> een sequence<br />

number toevoegen, <strong>voor</strong> zover nodig om een unieke identifier te vormen. De transacties die het<br />

<strong>revision</strong> <strong>control</strong> system wijzigen zijn vaak complex. De starttijd van een transactie is een<br />

timestamp, maar items binnen de transactie kunnen een volgnummer behoeven. Waarschijnlijk kan<br />

ook hier<strong>voor</strong> het sequence nummer gebruikt worden, mits dit niet ten koste gaat van het gebruik van<br />

de temporele uitbreidingen van de database.<br />

Software bestaat uit files, die in een drawer zijn verzameld. Drawers hebben een folder structuur, de<br />

files staan in de folders. Een file staat op een willekeurig moment slechts in één folder. Een drawer<br />

is gealloceerd in een location. Bij<strong>voor</strong>beeld op een server, of op een PC.<br />

De keuze <strong>voor</strong> files en folders als identificeerbare elementen in een <strong>revision</strong> <strong>control</strong> system is<br />

redelijk traditioneel. Toch impliceert dit enige regels <strong>voor</strong> de software die erin is opgeborgen. Een<br />

software entiteit, bij<strong>voor</strong>beeld een class, een component, een variabele, een procedure, een namespace<br />

wordt alleen dan geregistreerd en geïdentificeerd in <strong>Climbexion</strong> als die één op één<br />

correspondeert met een file, een folder, of een ander <strong>Climbexion</strong> element. Van te voren dien je te<br />

bedenken wat je wel en niet samen in een file (of een folder) stopt.<br />

Het <strong>revision</strong> <strong>control</strong> system bevat files. Mutaties wijzigen die files. Deze mutaties wijzigen zowel<br />

de werkelijkheid (de files) , alsook de kennis (van het <strong>revision</strong> <strong>control</strong> system) omtrent die<br />

werkelijkheid, dus kunnen we het ons gemakkelijk maken: “transaction time” = “valid time”. We<br />

hoeven alleen maar de valid time te implementeren. Kortom de repository is zijn eigen “universe of<br />

discourse”.<br />

Een file kan stadia doorlopen: er is een “course of development” of kortweg een “course”. Er is een<br />

course van zijn name, van de folder waarin hij <strong>voor</strong>komt: de folder reference, en van zijn contents.<br />

Het bestaan van een file in een drawer: zijn existence kan eindigen, en misschien later weer<br />

beginnen: er is een existence course. Samengevat: er is een course van de file. De events die de<br />

course van een file vormen zijn <strong>voor</strong>zien van een timestamp: de transaction time. Zo'n event is<br />

bij<strong>voor</strong>beeld een naamswijziging, of een move naar een andere folder, of een gewijzigde inhoud of<br />

een combinatie ervan. De events van een course zijn bijna altijd “Aton-achtige updates” die een<br />

Pagina: 54 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

oude waarheid, een oude realiteit, vervangen door een nieuwe, alleen vergeten we de oude waarheid<br />

niet met de komst van de nieuwe, we overschrijven niets meer. Het is de “transaction time” die<br />

maakt dat een “course” een adequate data structuur is, waar<strong>voor</strong> geldt: de enige manier om de<br />

course te wijzigen is een toevoeging aan zijn tip. Een dergelijke toestandswijziging, is ook typisch<br />

een “valid time” overgang. Iedere toevoeging wijzigt de repository en daarmee ook de<br />

werkelijkheid. Ik zal ze “successions” noemen. Omdat hier geldt: “transaction time” = “valid time”,<br />

en we aannemen dat de implementatie van de climbexion betrouwbaar is, daarom is een succession<br />

onbetwistbaar en behoeft nooit gewijzigd te worden, en ook de timestamp waarmee de overgang<br />

ingaat wijzigt nooit meer.<br />

Het <strong>revision</strong> <strong>control</strong> system legt verwantschappen vast tussen versies van files, zolang ze uit elkaar<br />

“<strong>voor</strong>tkomen”. Het legt geen bloedlijnen vast, zodat je in één oogopslag kunt zien: hé die<br />

eigenschap ven de versie komt van zijn betovergrootmoeder. Ook ontleedt het geen chimaera: als<br />

functionaliteit verhuist van de ene file naar de andere, dan wordt er geen relatie gelegd tussen de<br />

file die de functie levert, en de file die de functie ontvangt: een functie is geen geregistreerde een<br />

entiteit.<br />

Het wijzigen van names en folder references, zoals dat hier geschetst wordt, lijkt op vrijheid,<br />

blijheid en anarchie. Je moet hier natuurlijk bedachtzaam, en liefst spaarzaam mee omgaan. In de<br />

aanloopfase van een programma kan het best wenselijk zijn om namen te wijzigen, en ook tijdens<br />

fasen van heroverweging, zoals die gelden als je van het ene project overgaat naar het volgende, of<br />

van de ene chip naar de volgende. Een doel van architectuur is immers om een omgeving te creëren<br />

waarin mensen zich kunnen oriënteren, en een goede naamgeving en een goede indeling lijken dan<br />

ook onontbeerlijk, ook al dragen ze niet bij aan een oplossing van het probleem. Om het goede te<br />

bereiken, moet je soms het minder goede kunnen veranderen. (Nou ja “soms?” Je kunt aan<br />

verbeteren een heel leven wijden.)<br />

Pagina: 55 / 230<br />

File met course


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Een overeenkomstige file in een andere drawer heeft meestal dezelfde name en staat over het<br />

algemeen in dezelfde folder, maar hij kan een andere name hebben, en in een andere folder staan, en<br />

een andere inhoud hebben. Toch zijn deze files verwant. Ik denk dit te realiseren door te stellen dat<br />

ze tot dezelfde “kin” behoren. Een kin heeft een identificatie. Een file kan niet verhuizen van de ene<br />

drawer naar het andere. De file vertegenwoordigt de kin in de drawer. Ik denk dat in andere <strong>revision</strong><br />

<strong>control</strong> systems het begrip trunk het meeste overeenkomt met een kin. Maar een trunk heeft een<br />

course en een kin niet. Een kin wordt hooguit door één file vertegenwoordigd in een drawer. Deze<br />

file heeft binnen de drawer een niet wijzigbare identificatie: die van de kin.<br />

Een stadium in de ontwikkeling van een file is een snapshot van de file. De inhoud van dit snapshot<br />

staat in een worm (write once read many-times) file. Traditioneel heet zo'n wormfile een “version”.<br />

Zo'n version kan kan worden hergebruikt. Meestal in een file in een andere drawer, die tot dezelfde<br />

kin behoort. Een version mag meer dan eens <strong>voor</strong>komen in de content course van een file:<br />

bij<strong>voor</strong>beeld ten gevolge van een “undo” operatie. In de content course van de file staat een reeks<br />

referenties naar versions, die zelf in een pool zijn opgeslagen. In plaats van content course kunnen<br />

we ook spreken van een version course.<br />

De huidige toestand, of de toestand die een file of een folder had tussen twee events heet een<br />

snapshot. De course van een element kan worden gezien als een reeks snapshots, of als een reeks<br />

events die zijn gesorteerd op transaction time.<br />

Een transaction kan meerdere files en folders wijzigen. De mutaties van de transaction die slechts<br />

één file wijzigen noemen we een event. Eén enkele wijziging die een event teweeg brengt noemen<br />

we een event item, of een course item. Een event item breidt slechts één elementaire course (name,<br />

folder reference of version, e.d.) uit. De wijziging die een transaction teweegbrengt, de verzameling<br />

mutaties, noemen we een changeset. (Ik vond ook het woord “patch” <strong>voor</strong> changeset. Binnen<br />

<strong>Climbexion</strong> wordt het woord “patch” soms gebruikt <strong>voor</strong> changesets die gestuurd worden naar<br />

andere teams).<br />

Transactions mogen niet tegelijkertijd door elkaar heen worden aangebracht: er is een course van<br />

changesets. Het effect van een changeset is een nieuw snapshot in de drawer en wordt wel een<br />

Pagina: 56 / 230<br />

Snapshots


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

“<strong>revision</strong>” genoemd.<br />

De event items die een file wijzigen worden toegevoegd aan een course van de file, die daardoor in<br />

een nieuwe toestand komt. Nieuwe toestanden van folders worden veroorzaakt door wijziging van<br />

hun name of één van hun andere eigenschappen, en toegevoegd aan hun eigen courses.<br />

Transactions, events, event items, kins, files, en versions kunnen attributes bezitten die geen<br />

succession zijn: Bij<strong>voor</strong>beeld de mededeling: deze transaction lost probleem X op, of Deze version<br />

is gekopieerd uit Project Y. Ze vervangen geen oude werkelijkheid door een nieuwe. Soms is er<br />

geen garantie dat de informatie correct is. Dan geldt niet “valid time”=”transaction time”. Er is geen<br />

course of development, maar hoogstens een course of metadata corrections, die hopelijk eindigt<br />

zodra de informatie correct is. De timestamps in een course of metadata corrections zijn transaction<br />

times, maar geen valid times: ze “erven” de valid time van het object waarop ze slaan.<br />

Voor een folder geldt wat <strong>voor</strong> een file geldt: er is een kin die hij vertegenwoordigt. Een folder is –<br />

net als een file – een element. Voor een element in zijn algemeenheid geldt: er is een kin van het<br />

element.<br />

Op een zeker tijdstip geldt: In een folder staan files en folders. Dit is de “memberset” van de folder.<br />

De “inner-reach” van een folder is een verzameling elements. Ze bestaat uit de folder zelf, zijn<br />

memberset, en de inner-reach van de folders die tot zijn memberset behoren. “Shallow” en “deep”<br />

zijn de termen die ik elders vond.<br />

Veel queries in het <strong>revision</strong> <strong>control</strong> system selecteren de inner-reach van van een folder op een<br />

zeker tijdstip. In feite wordt nu van ieder element een snapshot geselecteerd uit zijn course. We<br />

zullen meestal het begrip snapshot gebruiken als snapshot van de inner-reach van een drawer of een<br />

folder. De begrippen event en event item zullen we echter specifiek gebruiken <strong>voor</strong> een toevoeging<br />

aan een specifieke course. Een snapshot is een willekeurig tijdstip, maar vanwege het feit dat<br />

transactions atomair zijn, en hun changeset helemaal wel of helemaal niet is geïmplementeerd,<br />

kunnen we slechts snapshots gebruiken die een changeset volledig insluiten of uitsluiten. Snapshot<br />

timestamps zullen eventueel worden afgerond zodat de toestand die ze duiden jonger is dan de<br />

changeset die ingelijfd werd op die tijd, maar ouder dan de volgende changeset.<br />

Het lijkt erop dat we een aantal (bijna) synoniemen hebben geïntroduceerd: transaction, changeset,<br />

<strong>revision</strong>, snapshot, waarmee we zienswijzen of effecten van hetzelfde fenomeen aanduiden.<br />

Sommige folders worden package of subsystem genoemd. Als ik het heb over een package dan<br />

bedoel ik de inner-reach van de folder. Een package representeert een eenheid software die<br />

uitgewisseld wordt. Een package wordt in zijn geheel beheerd. Er is een eigenaar. Voor packages<br />

gelden de volgende opmerkingen:<br />

● Een drawer bestaat uit packages. De packages vormen een tree. We introduceren een nieuw<br />

element: de “package reference”. Een reference staat in het ene package en wijst naar een<br />

ander. Zo wordt de tree gevormd: een verwijzing wijst van de top af. Een package reference<br />

heeft courses: name, folder reference, existence.<br />

● Het begrip inner-reach moet nu aangepast worden. Een package reference naar een ander<br />

package behoort tot de inner-reach, maar het andere package zelf niet. Naast deze nieuwe<br />

definitie van inner-reach <strong>voor</strong> folders en packages bestaat er soms behoefte om alles<br />

binnen een drawer aan te duiden: dan noem ik expliciet: de inner-reach van een drawer.<br />

● Een top folder van een package blijft altijd de top folder van het package: er is geen course<br />

van folder references. Ook is er geen course van names. De eigenschap top of package van<br />

Pagina: 57 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

een folder is er bij het ontstaan van die folder, de eigenschap kan niet later ontstaan, en de<br />

folder kan deze eigenschap niet verliezen.<br />

● Wat ik een drawer noem wordt dikwijls een “tree” genoemd. Bedoelt wordt een folder en<br />

file tree. Men moet dan denken aan een groeiende boom die uit de gezamenlijke courses van<br />

alle elements bestaat, zoals een file een groeiende file is. In dit verhaal gebruik ik het woord<br />

tree alleen bij een snapshot, waarschijnlijk vind ik het een moeilijk begrip: bij een groeiende<br />

Pagina: 58 / 230<br />

Inner-reach en Memberset


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

boom zie ik niet iets <strong>voor</strong> mij waarvan bij<strong>voor</strong>beeld een tak zich verplaatst naar een andere<br />

tak.<br />

● Voor een folder tree van een drawer geldt dat de name van een package reference de name<br />

wordt van de top folder van het gerefereerde package.<br />

● Een drawer zelf bevat een verzameling (Engels: set) packages. Ieder package bevat een<br />

verzameling elements. Er is op ieder moment één top package. De reference ernaar staat in<br />

de drawer. Verder is er op ieder moment per package hoogstens één reference geldig naar dat<br />

package. Die reference moet ook nog eens in een ander package of in de drawer staan. Als<br />

een package <strong>voor</strong>komt in een drawer dan is het wel de bedoeling dat er minstens een tijdje<br />

een reference naar het package geldig is. De courses van een package reference in een<br />

package: er is een existence course, en er is een name course, en een folder reference course,<br />

maar geen course van references naar packages. Het element heeft gedurende zijn leven één<br />

reference naar de kin van één package. De package reference naar het top package van de<br />

drawer kent mogelijk wel een course van package references, maar het besluit daarover<br />

moet nog genomen worden.<br />

● Een element in een package kan het package niet verlaten. Folder references zijn lokaal<br />

binnen het package. De kin van een element wordt geregistreerd en bijgehouden bij het<br />

package in een kin pool, ook de versions van een file komen in een package pool.<br />

● Omdat een package een eenheid van beheer is zouden changesets bijgehouden kunnen<br />

worden per package. Ieder package heeft dan één changeset element. De uiteindelijke<br />

beslissing hierover stel ik uit naar de formele beschrijving van het systeem.<br />

Er zijn waarschijnlijk drawers die slechts één package bevatten. De later te benoemen importdrawers<br />

en export-drawers komen in aanmerking om één package te bevatten De drawer kan dan<br />

vereenzelvigd worden met het package, er is geen onderscheid. Al met al lijkt het er momenteel op<br />

dat een drawer een andere “bolster” heeft dan een package, omdat de laatste altijd in een drawer zit,<br />

terwijl een drawer in een file system zit, misschien als folder, misschien als file.<br />

Pagina: 59 / 230<br />

Samenvoegen package reference en top folder in een working-tree<br />

Package en top-folder kunnen eventueel gereduceerd worden tot één enkel element.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Er is eventueel een alternatief <strong>voor</strong> het top-package. Een drawer zou standaard een top-folder<br />

kunnen bevatten, net als een package. Het werken met packages is dan een optie. Een besluit<br />

hierover stel ik uit. In de formele definitie moet maar een keus worden gemaakt. Voorlopig is een<br />

drawer een verzameling packages<br />

Het meest recente snapshot van een drawer (het heden, “nu”) heet de tip van de drawer. De tip kan<br />

worden gekopieerd naar een overeenkomstige folder structuur op een desktop, laptop of een server.<br />

Zo'n kopie heet een working-tree (ik vond ook de termen working folder, working directory en<br />

sandbox). In een working-tree wordt een package reference en de bijbehorende top-folder van het<br />

package samengevoegd tot één folder.<br />

In zo'n working-tree kunnen updates plaatsvinden. De gewijzigde versions en andere course-items<br />

kunnen daarna met de opdracht “commit” (ook wel “check-in” genaamd) worden toegevoegd aan<br />

de tips van de files in de drawer Ze vormen de nieuwe tips van de elements. Sommige wijzigingen<br />

kunnen niet zonder meer aangebracht worden in de working-tree en daarna met “commit” de<br />

courses uitbreiden, bij<strong>voor</strong>beeld naamswijzigingen, folder wijzigingen, het starten of beëindigen<br />

van een course. Dergelijke wijzigingen moeten worden aangebracht met <strong>Climbexion</strong> software in de<br />

working-tree, zodat ze daarna of gelijktijdig met commit in de drawer geplaatst kunnen worden.<br />

Normaal gebruik ik de Engelse termen, maar ik denk dat ik het werkwoord “to commit” niet ga<br />

vervoegen in het Nederlands. Ik zal dan de term “vastleggen” gebruiken: “iets met commit<br />

vastleggen”<br />

Een file in de working-tree wordt beschouwd als een kopie van de tip van een element als zijn pathname<br />

overeenstemt met die van het element, en als zijn timestamp (last changed date/time)<br />

overeenkomt met de timestamp van de tip van het element. Als de timestamp afwijkt dan wordt<br />

verondersteld dat de file een andere version is geworden. N.B. De timestamp in een filesysteem is<br />

vaak minder precies dan die in de repository. Maar <strong>voor</strong>lopig moet <strong>Climbexion</strong> het er maar mee<br />

doen.<br />

Om een nieuwe file in een drawer te specificeren wordt een “add” opdracht gebruikt. In één add<br />

opdracht kunnen meerdere elements worden toegevoegd aan de drawer. Meestal door in de<br />

working-tree vast te stellen wat erin <strong>voor</strong>komt dat niet inde drawer staat, maar wel van belang is. In<br />

<strong>Climbexion</strong> zou “add” gebruikt kunnen worden om een nieuwe kin te duiden, terwijl “copy” of<br />

“inherit” gebruikt wordt als de kin reeds elders bestaat. Bij het gebruik van inherit wordt niet<br />

gekeken in de working-tree, maar in een andere drawer. Bij add en inherit worden name en folder<br />

reference initieel ingevuld, die courses zijn er daarna reeds. Merk op dat een nieuw package niet<br />

zonder meer kan worden afgeleid uit een nieuw element in een working-tree. Verder wordt de term<br />

“check-out” gebruikt om de working-tree af te leiden (soms opnieuw) van de tip van de drawer.<br />

Voor het beëindigen van (de courses van) een element zou “remove” of “delete” kunnen worden<br />

gebruikt. Het gebruik van “add” wijkt af van het gebruik in sommige andere systemen. Daar werkt<br />

men met een schaduw working tree, van waaruit eventueel half gewijzigde files kunnen worden<br />

terug gehaald in de working tree, of heel gewijzigde files met commit worden overgedragen in de<br />

drawer. Wij gaan uit van persoonlijke drawers, waarin naar hartenlust wijzigingen kunnen worden<br />

opgeslagen en eventueel teruggehaald in de working tree, <strong>voor</strong>dat een snapshot ontstaat dat kan<br />

worden overgedragen naar een team drawer.<br />

Pagina: 60 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Over de naamgeving<br />

folder: oorspronkelijk een gevouwen map om documenten in te bewaren<br />

file: oorspronkelijk een geordende verzameling documenten, die aan een koord zijn bevestigd. Toen<br />

ik kennismaakte met computer files, bestond zo'n file uit records, bij<strong>voor</strong>beeld klant records die de<br />

de rubrieken naam, adres, woonplaats bevatten.<br />

record: oorspronkelijk een document waarin een gebeurtenis is opgetekend.<br />

Het Nederlandse “kaartenbak” laat zich vertalen als “file”, maar het Nederlandse “ordner” wordt<br />

vertaald als “folder”.<br />

In een software archief denk je bij file toch meer aan één enkel document – bij<strong>voor</strong>beeld een source<br />

document – dan aan een geordende reeks documenten. De begrippen file en document zal ik door<br />

elkaar gebruiken, als synoniemen. Bij<strong>voor</strong>beeld een reeks baseline reports vormt niet een file, maar<br />

een file-string.<br />

package: pakket. Hierbij heeft men het versturen en ontvangen van de spullen op het oog. Ik<br />

gebruik het woord package in plaats van (sub) system omdat dit iets meer in lijn is met folder, file,<br />

en document. Ik denk dat mijn package voldoet aan de UML definitie.<br />

Drawer. filing cabinet: archief kast <strong>voor</strong> het opbergen van files en folders en packages. Helaas<br />

bestaat dit begrip reeds <strong>voor</strong> archief files van Microsoft. Ik denk dat ik daarom het woord drawer<br />

(lade) ga gebruiken. Bovendien komt dat nog het dichts bij het begrip “branch” in andere VCS<br />

systemen. Oorspronkelijk gebruikte ik het woord area, maar dat sloeg nergens op. Drawer als deel<br />

van het opbergsysteem van folders files (documenten) en packages blijft horen bij de metafoor.<br />

Pool wordt gebruikt in de betekenis: "common reservoir of resources". Dat is een repository<br />

natuurlijk ook, maar ik gebruik het begrip <strong>voor</strong> een verzameling kins, of een verzameling versions,<br />

of verzamelingen van andere objecten die gedeeld worden door drawers.<br />

Kin: verwantschap. Oorspronkelijk gebruikt ik archetype, toen stolon en ik ben blijven hangen op<br />

kin. Zowel het Engelse als het Nederlandse “kind” zijn hiermee verwant. Hier vond ik geen begrip<br />

dat binnen de metafoor bestaat.<br />

Pagina: 61 / 230<br />

Gebruikte symbolen


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

2.2.2 De organisatie van het geheel aan drawers<br />

Drawers zijn er in soorten en maten. Er is een drawer <strong>voor</strong> een team dat betrokken is bij een project.<br />

Van zo'n drawer en de files en folders die erbij horen, wordt de volledige course bijgehouden. Zo'n<br />

Pagina: 62 / 230<br />

Drawers van een subproject


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

drawer moet zelf ook eeuwig blijven bestaan. Een team is meestal betrokken bij meer dan één<br />

project. Er is dan <strong>voor</strong> elk project een team-drawer.<br />

Dan zijn er drawers <strong>voor</strong> team members. De team members wijzigingen files (via de working-tree)<br />

in hun eigen drawer en dragen daarna de wijzigingen over aan de team-drawer. De overdrachten<br />

zelf zijn te volgen in het team-drawer. Drawers <strong>voor</strong> team members moeten kunnen komen en gaan,<br />

ze zijn er <strong>voor</strong>al <strong>voor</strong> de actuele behoeften. Zo'n drawer is een satellite van de team-drawer. De<br />

team-drawer is de center-drawer van zijn satellites. De hele constellation heet naar zijn centerdrawer.<br />

Dit komt denk ik overeen met het “cone” model van een lifeline van Ben-Michael Schueler. Met dit<br />

model van recente ontwikkeling wordt het team member een faciliteit geboden om zijn eigen werk<br />

te reconstrueren, totdat hij de taak die tot het werk heeft geleid als beëindigd beschouwt.<br />

Een overdracht van member naar team brengt de team-drawer "in sync" met (een deel van) de<br />

satellite van een team member. Maar er is ook een faciliteit waarmee het team member zijn satellite<br />

"in sync" brengt met die van het team.<br />

Een satellite is typisch een werkplaats, waar transactions (changesets) op de center-drawer worden<br />

<strong>voor</strong>bereid. De transactions in een satellite zijn daarom meestal nogal fragmentarisch van aard. Bij<br />

de overdracht naar de center-drawer wordt een course traject uit de satellite dan samengevat tot één<br />

event item. Ook kan een transaction in de satelliet een enkele version van een enkel element<br />

bevatten, terwijl de overdracht naar de team drawer meerdere elements en courses wijzigt, omdat<br />

de team area op elk moment aan allerlei eisen moet voldoen. In de courses van de satellite kun je de<br />

wording van een oplossing volgen. In een satellite kun je desnoods versions vastleggen: “gewoon,<br />

omdat het lunchtijd is”.<br />

Waarmee moet je een satellite vergelijken in een DAG (Directed Acyclic Graph) systeem? In de<br />

moderne open source version <strong>control</strong> systems, creëer je op je PC een clone van een centrale<br />

repository. Als je een wijziging aanbrengt dan creëer je op de tip van de clone een branch, waarin je<br />

de wijziging bereidt. De tip van de branch draag je daarna over aan de (centrale) repository. Een<br />

satellite zoals ik hem schetste is in feite een sequence van deze branches. Sterk punt van de DAG is<br />

<strong>voor</strong>lopig: je kunt aan meerdere wijzigingen tegelijk werken. In een satellite moet je strikt<br />

sequentieel werken, en <strong>voor</strong> parallellisme heb je er meer dan één nodig. Aan de andere kant, met<br />

satellites heb je lokaal geen clone nodig van de team-drawer. Het lijkt erop dar er twee opties zijn:<br />

● Je kunt werken met één satellite per teamlid, per center-drawer, per wijziging. Op je PC zou<br />

je dan een directory kunnen maken die correspondeert met de center-drawer, en daarin<br />

satellites creëren die corresponderen met een probleem (of een stukje delta processing, of<br />

echte nieuwbouw, of een change request).<br />

● Als je je satellite niet meer nodig hebt kun je die naderhand met “append” toevoegen aan<br />

de “history” satellite.<br />

Als je een branch creëert wordt er een working-tree gecreëerd, met folders en versions, en als je een<br />

satellite creëert wordt bovendien het eerste snapshot gecreëerd in de satellite. De aanmaak tijd van<br />

een satellite is daarom slechter dan de aanmaak tijd van een branch, gesteld dat de betreffende<br />

<strong>revision</strong> <strong>control</strong> software door dezelfde persoon ongeveer gelijktijdig is gemaakt. Dit is <strong>voor</strong> mijn<br />

hobby acceptabel genoeg. Bovendien, ik wil toch zien of het mogelijk is om met een strikt lineaire<br />

en onvertakte structuren te werken.<br />

Vaak vindt de overdracht van satellite naar center-drawer niet rechtstreeks plaats, maar via een<br />

transfer-drawer. Er vindt (periodiek, bij<strong>voor</strong>beeld 's nachts) een validatie plaats van de<br />

Pagina: 63 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

overgedragen software, en na acceptatie wordt de center-drawer bijgewerkt, vanuit de transfer<br />

drawer. In wezen kan de inhoud, als een envelope niet wordt geaccepteerd wel deel uitmaken van de<br />

transfer drawer, maar niet van de team drawer.<br />

In Synergy gebruikten we een soort “transfered” status in plaats van een transfer drawer. Zo'n<br />

status kun je beschouwen als een tijdelijke branch aan de tip. Bij een status verandering van alle<br />

items in de branch naar “accepted” veranderde de branch in een uitbreiding van de trunk. Dit was,<br />

meen ik, zo gemaakt dat items afzonderlijk van status konden veranderen.<br />

Binnen de drawer van een team zijn er packages die onderhouden worden door het betreffende<br />

team, en packages waarop het team zich abonneert. Een ander team in hetzelfde master project<br />

onderhoudt andere packages. Er is dan ook een uitwisseling van recent gewijzigde packages.<br />

Tussen projects die hetzelfde package onderhouden (“sister-projects”) wordt er onderling ook heel<br />

wat uitgewisseld. Een team in een nieuw project baseert zijn packages op die van <strong>voor</strong>gaande<br />

projects. In sommige fasen wordt een package volledig gesynchroniseerd met die uit een ander<br />

project, op een ander moment moeten slechts oplossingen van bepaalde problemen worden<br />

overgenomen. Voor beide methoden moeten er faciliteiten komen.<br />

We hebben te maken met geheimen. Klanten willen bijna nooit dat hun oplossingen en methoden<br />

door NXP worden doorgegeven aan andere klanten. Er moeten daarom een behoorlijke barrières<br />

zijn tussen projects <strong>voor</strong> verschillende klanten. Vaak wordt geëist dat NXP <strong>voor</strong> een klant een eigen<br />

repository gebruikt.<br />

Er kunnen export limitations gelden bij de overname van wijzigingen tussen de sister-projects. In<br />

een package dat je aanpast volgens specificaties van klant A kunnen geheimen zitten die klant B niet<br />

mag weten. Je kunt dan niet onbeperkt alles overnemen als je hetzelfde package aanpast <strong>voor</strong> klant<br />

B.<br />

Ook NXP heeft geheimen, die hopelijk een (mogelijk tijdelijke) <strong>voor</strong>sprong geven op concurrenten.<br />

NXP wil niet dat die geheimen via een klant of zo in het bezit komen van de competitie, want ze wil<br />

zo lang mogelijk profiteren van de <strong>voor</strong>sprong, immers alleen met een <strong>voor</strong>sprong verkoopt ze veel<br />

chips <strong>voor</strong> een behoorlijke prijs. Zolang de digitale tv sterk in ontwikkeling is kan er geconcurreerd<br />

worden met geavanceerde oplossingen, en dat gebeurt dan ook. Enerzijds gebeurt dit met patenten,<br />

en anderzijds met verrassingen (geheimen).<br />

Niet alleen zijn er de barrières tussen de sister-projects, maar ze zijn er ook tussen teams in<br />

hetzelfde master project. Soms stellen teams slechts de binaire executable componenten en de<br />

interfaces van een package beschikbaar: er moeten faciliteiten komen om export limitations te<br />

realiseren.<br />

Een team dat zich abonneert op packages is vaak niet geïnteresseerd in alle files in alle folders.<br />

Source files zijn belangrijk <strong>voor</strong> debugging, maar documentatie niet direct. Alles wat te maken heeft<br />

met het specifiek testen van het package is niet van belang in de drawer van een ander team. Er<br />

moeten dus faciliteiten komen om query's met import limitations mogelijk te maken. Dit is <strong>voor</strong>al<br />

een optimalisatie. Binnen een team kan de ene persoon zich bezighouden met een test van het hele<br />

product, de ander is meer geïnteresseerd in de test van een layer, en heeft dan minder packages<br />

nodig. Hier moeten zorgvuldig gekozen selecties zorgen <strong>voor</strong> een beperkte samenstelling van een<br />

Pagina: 64 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

satellite, ook hier is sprake van limited import queries. Een working-tree van de totale software<br />

stack is inmiddels tientallen gigabytes groot. Met alle consequenties <strong>voor</strong> importeren, exporteren,<br />

synchroniseren, en compileren: allemaal processen die veel tijd vergen, en zelfs in belangrijke mate<br />

de doorlooptijd en capaciteit van een project bepalen. Import limitations kunnen een query betreffen<br />

van de files die je wilt overnemen uit een andere drawer, gewoon omdat je daarbuiten niets wilt<br />

overnemen uit die drawer. Maar ook kan het zijn dat je bepaalde files of folders nooit in je drawer<br />

wilt hebben, dan “hangen” de import limitations niet aan de query, maar aan de drawer.<br />

Mogelijk leidt het bestaan van de limitations tot subpackages. Om import limitations te faciliteren<br />

zou mogelijk een subpackage gedefinieerd kunnen worden ten behoeve van de unit tests. Om<br />

geheimen te isoleren zou men ook een subpackage kunnen gebruiken. Voorlopig ga ik ervan uit dat<br />

een subpackage mogelijk is door hem als een gewoon package te definiëren, indien daar behoefte<br />

aan is.<br />

Niet alle drawers van een team zullen dezelfde import limitations krijgen. Tijdens het ontwikkelen<br />

gebruikt een programmeur vaak documentatie van interfaces en componenten. Voor het analyseren<br />

van problemen bij<strong>voor</strong>beeld zal je soms willen beschikken over de documentatie van de packages<br />

waarop je bent geabonneerd. Deze zijn dan bij<strong>voor</strong>beeld te vinden in de import-drawer, of de teamdrawer.<br />

Maar in een satellite <strong>voor</strong> een team member moet het voldoende zijn om te kunnen<br />

compileren en linken, en om de eigen documentatie te wijzigen. Ondanks import limitations kun je<br />

toch vaak beschikken over de documenten die je weert: ze staan immers in de drawer waaruit je<br />

importeert.<br />

Een import-drawer is een drawer waarin de packages van andere teams uit hetzelfde master project<br />

worden binnen gehaald. Een team heeft één zo'n import-drawer <strong>voor</strong> ieder van zijn projects Hierin<br />

zijn alle baselines, dus ook de nieuwste baselines van de packages beschikbaar, ook als ze (nog) niet<br />

zijn ingelijfd in de team-drawer. Misschien zijn er meerdere import drawers en bevat zo'n drawer<br />

slechts één package. Een externe referentie zoals een referentie naar een ander package, hoeft in<br />

zo'n drawer niet te worden opgelost.<br />

Een export-drawer is een drawer waarin de baselines van de eigen packages worden geplaatst. Om<br />

een eigen package te gebruiken in een ander project binnen het team gelden meestal geen<br />

beperkingen, en soms door de klant gevraagde restricties. Om zo'n package beschikbaar te stellen<br />

aan een client of een supplier gelden vaak wel export limitations, die van NXP. Vanuit deze drawers<br />

kan een package geëxporteerd worden naar een ander team of een ander project of beide. De export<br />

limitations die moeten worden gerealiseerd zijn afhankelijk van de rechten van het ontvangende<br />

team. Mogelijk bevat een export drawer ook precies één package.<br />

Een Project is een begrip dat ook binnen een <strong>revision</strong> <strong>control</strong> system gebruikt wordt Een team dat<br />

deelneemt aan een (master) project van een client, zorgt <strong>voor</strong> een (sub) project. Binnen dit<br />

subproject worden de drawers gecreëerd. Een team dat deelneemt aan tien projects heeft dus tien<br />

team-drawers. Een ander team, dat deelneemt aan vijf projects heeft vijf team drawers, en natuurlijk<br />

ook vijf import drawers enzo<strong>voor</strong>t. Als twee teams deelnemen aan één (master) project dan heeft<br />

ieder team daarin zijn eigen subproject met zijn eigen drawers. De subprojects van een team worden<br />

door mij sister-projects genoemd. Een enkel package wordt beheerd binnen een aantal sisterprojects.<br />

Sister-projects kunnen verdeeld zijn over enkele teams.<br />

Voor testers komt er mogelijk een aparte drawer, de test-drawer. Veel tests worden gedaan op<br />

baselines van packages, en niet op packages die van de ene naar de andere baseline onderweg zijn.<br />

Pagina: 65 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Eigenlijk worden baseline tests gedaan op de <strong>voor</strong>laatste fase van een package, <strong>voor</strong>dat de baseline<br />

definitief is. Zelf beheren de testers een aantal package -, layer -, en product - test-cases. Er is een<br />

bewaar structuur, waar<strong>voor</strong> het <strong>revision</strong> <strong>control</strong> system een folder structuur biedt. Test-cases worden<br />

samengesteld tot tests. Momenteel worden veel test-cases gedefinieerd in excel sheets. Ik vermoed<br />

dat dit nodig is <strong>voor</strong> een tool van de TMap methode. Ik denk dat dit niet zonder meer een <strong>voor</strong>deel<br />

is, want nu kan er niet geprofiteerd worden van standaard build - en merge - en synchronisatie -<br />

faciliteiten, die gebaseerd zijn op folder structuren en tekst-files. Naast test-cases, en tests en hun<br />

documentatie, zijn er nog de test-logs en test-results, die het waard zijn om te worden bewaard.<br />

Verder maken testers een progress report dat bewaard moet worden. Ook testers werken<br />

projectmatig, en ook hun drawers zijn exclusief <strong>voor</strong> een bepaald project. Mogelijk worden hun<br />

elements opgenomen in de team-drawer, en worden import limitations gebruikt als hun scripts niet<br />

nodig zijn.<br />

Als een nieuw subproject start, dan worden de eigen packages gekopieerd vanuit een sister-project<br />

dat deel uitmaakt van een ander masterproject, en later mogelijk bijgewerkt met wijzigingen van<br />

een sister-project. Hier<strong>voor</strong> gebruiken we mogelijk een speciale import-drawer: Merge-importdrawer.<br />

In een subproject is er een merge-import-drawer <strong>voor</strong> ieder sister-project waaruit<br />

groepsgewijs wijzigingen worden overgenomen.<br />

Bij het oplossen van problemen is de eerste stap die genomen moet worden: reproduceer de fout.<br />

Meestal moet de oplossing gerealiseerd worden in de meest recente versie van de team-drawer (via<br />

een satellite van een team member). Soms is het probleem daar niet te reproduceren, althans niet<br />

met de aanwijzingen in het problem report. Dan moet er geanalyseerd worden met behulp van de<br />

drawer van het team dat de fout ontdekte. Hier<strong>voor</strong> wordt een expose-drawer bijgehouden. Met in<br />

acht neming van export limitations wordt hier een omgeving bijgehouden, die meestal via het web<br />

is te benaderen, en waaruit info-trees kunnen worden getrokken. De expose-drawer is van het team<br />

dat het probleem ontdekte. Eén van de dingen die je dan bij<strong>voor</strong>beeld kunt doen:<br />

Je probeert of je het fenomeen kunt opwekken op een andere manier die wel<br />

reproduceerbaar is in de meest recente versie van de team-drawer.<br />

Het is me wel eens overkomen, dat ik niet de fout reproduceerde, maar een fenomeen dat er wat op<br />

leek. Gelukkig vond niemand het erg, dat ik het verkeerde probleem had opgelost, maar<br />

administratief (zie 2.5) was dat toch wel wat werk.<br />

Een team baseert zijn packages op die van het reference project, en wisselt soms oplossingen van<br />

problemen uit met het reference project. Dit moet soms kunnen met verschillende generaties van<br />

één <strong>revision</strong> <strong>control</strong> system, en heel soms met een totaal ander <strong>revision</strong> <strong>control</strong> system. Het kan ook<br />

zo zijn dat een team van de klant andere <strong>revision</strong> <strong>control</strong> system software gebruikt dan de NXP<br />

teams. Dan moet uitwisseling van software nog steeds mogelijk zijn.<br />

Pagina: 66 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

2.2.3 De organisatie van pools<br />

Pools zijn er <strong>voor</strong> versions, en <strong>voor</strong> kins. Iedere package heeft zijn eigen pools, waarin de versions<br />

en kins staan waarnaar wordt verwezen vanuit de inner-reach van drawers. Om redenen van<br />

optimalisatie robustness en security kunnen er locations bestaan. Op iedere location staan local<br />

pools die de drawers bedienen die tot de location behoren. Een local pool bevat een subset van de<br />

kins van een package, en een andere een subset van de versions van de kins. Bij overdrachten vanuit<br />

een drawer op location A naar een drawer op location B worden indien nodig kins en versions<br />

gekopieerd. Een URL (uniform resource locater) identificeert een location, pool of drawer, of<br />

kortom een resource.<br />

Pagina: 67 / 230<br />

Kin en version pools van Party F


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Local pools zijn er op de server van een team. Deze pools bedienen de center-drawers, de<br />

import-drawers, de full export-drawers en de full expose-drawers. Voor export-drawers met export<br />

limitations komen er pool verzamelingen per party indien nodig. Er zijn twee soorten export<br />

limitations: de NXP pools dienen <strong>voor</strong> distributie binnen het master projects, de CLIENT pools<br />

dienen <strong>voor</strong> de distributie van NXP software binnen sister projects, tenminste als het package client<br />

geheimen bevat.<br />

Voor ieder package is er een centrale location Een pool daar wordt gewijzigd zodra een kin of een<br />

version in twee of meer locations <strong>voor</strong>komt, dan wordt de entiteit ook toegevoegd aan de centrale<br />

pool. Elk package heeft zijn eigen centrale. Als attributes van een version of een kin wijzigen dan<br />

worden die gepusht naar de centrale location, tenminste als daar de version of de kin <strong>voor</strong>komt en<br />

vandaar met pull methoden gedistribueerd. Eventueel worden notificaties gestuurd naar<br />

belanghebbenden.<br />

Overigens: onze partners in een masterproject gebruiken onze export pools <strong>voor</strong> het overnemen van<br />

attribute wijzigingen.<br />

Eventueel is er een tree van centrale pools, waarvan de nodes een organisatorische eenheid<br />

bedienen.<br />

De centrale version pool van een package bevat geen versions, dat wil zeggen, niet de content van<br />

de versions, maar slechts de attributes.<br />

Van envelopes (zie 2.2.6) kunnen er ook lokale kopieën <strong>voor</strong>komen. Centraal is de constellation<br />

pool, en lokaal zijn de PC pools van de teamleden. Ook nu worden nieuwe envelopes en<br />

wijzigingen gepusht vanuit een lokale naar de centrale pool, en vandaar uit met een pull methode<br />

gedistribueerd. Een teamlid bepaalt welke envelopes lokaal op zijn PC worden bewaard, en<br />

hoelang.<br />

2.2.4 De organisatie van snapshots<br />

Binnen ons team werden 's nachts de overdrachten van de teamleden getest en daarna werden de<br />

overgedragen wijzigingen aangebracht in de team drawer. Dan werd er een tag geregistreerd. Een<br />

tag definieert de toestand (inner-reach) van een drawer op een tijdstip. Zo'n geregistreerd snapshot<br />

garandeert een bepaalde kwaliteit van de drawer. In ons team was er de garantie dat de drawer goed<br />

door een acceptatie test kwam.<br />

De meest recente tag heet een tip-tag.<br />

Een package (of vaak een groepje packages) kan een stadium bereiken, waarop er een baseline<br />

wordt geformuleerd, en geregistreerd. Bij een baseline hoort een baseline report. Dit document<br />

bevat informatie zoals: de problemen die zijn opgelost en de planning items die zijn gerealiseerd,<br />

misschien enige baseline supplement (patch) informatie. Ook worden de baselines van andere<br />

packages genoemd waarmee het package is getest. Verder staat erin op welke hardware het package<br />

moet kunnen werken, en nog veel meer informatie. Zo'n baseline van een package wordt<br />

geëxporteerd naar andere teams samen met het baseline report. Tussen baselines door kunnen er<br />

baseline supplements (tussentijdse wijzigingen) nodig zijn op het package. In <strong>Climbexion</strong><br />

definieert de baseline een snapshot van één of meer packages.<br />

Pagina: 68 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Baseline report: Eerst noemde ik het “baseline document”. Later herinnerde ik mij dat een report<br />

een beschrijving is van iets dat geobserveerd kan worden. Als je werkt met fasen is een report een<br />

afsluitend document van de oude fase. Dat geldt ook als je <strong>voor</strong>al faseert om regelmatige<br />

uitwisseling van software te bewerkstelligen. Andere documenten zijn dan een stuk minder<br />

belangrijk, zoals een risico analyse en een plan van aanpak <strong>voor</strong> de volgende fase, die hoeven<br />

misschien pas als een echte project fase is bereikt. Vaak is er wel een plan <strong>voor</strong> de volgende fase,<br />

dikwijls vind je dat in een verslag van een vergadering.<br />

Ik denk tags en baselines te realiseren in speciale elements. Tag-elements komen in de absolute top<br />

folder van de drawer, en baseline elements in de top folder van het package. Elke keer dat er een<br />

nieuwe tag of baseline wordt gedefinieerd wordt de course van het betreffende element uitgebreid<br />

met een item. Ook als een bundel packages een nieuwe baseline krijgt, dan nog is het zinvol om een<br />

baseline per package te specificeren, gezien de documentatie (het baseline report) die er bij hoort.<br />

Als een nieuwe baseline van een package geïmporteerd wordt, dan wordt als laatste een event item<br />

uitgevoerd waarmee de baseline tag wordt geïmporteerd. Als een satellite gesynchroniseerd wordt<br />

met de tip-tag van een center, dan wordt het tag-item als laatste gekopieerd. De periodieke baselines<br />

van een package komen in één tag-element. Maar de bijbehorende baseline reports komen in andere<br />

elementen.<br />

Bij tijd en wijle wordt een snapshot verheven tot “project milestone”. We spreken af dat dit<br />

snapshot altijd een baseline is. Dit heugelijke feit mag geregistreerd worden door een extra tag toe<br />

te voegen aan een package of een drawer. Deze milestone tag ontstaat pas als het snapshot reeds<br />

bestaat, en mogelijk opgevolgd is. Er geldt dus doorgaans dat transaction time en valid time<br />

verschillend zijn. Vaak volgt zo'n eenmalige tag op een audit, die het licht <strong>voor</strong> de volgende project<br />

fase op groen zet. We kunnen dit eventueel ook realiseren door een attribute toe te voegen aan een<br />

baseline tag, die hiermee extra wordt gemarkeerd. Mogelijk kent een subproject milestones, die<br />

gelden <strong>voor</strong> meerdere packages, misschien gelden milestones <strong>voor</strong> het master project, en als<br />

zodanig <strong>voor</strong> de subprojects en hun packages. De kunst is natuurlijk om deze markeringen niet<br />

alleen in de export-drawer te realiseren, maar ook door te voeren bij de afnemers.<br />

Tags worden in andere <strong>revision</strong> <strong>control</strong> systems wel “label” genoemd. In Software Configuration<br />

Management wordt het begrip “baseline” hier<strong>voor</strong> gebruikt. Ook de term “milestone” komt <strong>voor</strong>.<br />

Wij zullen het woord “baseline” gebruiken <strong>voor</strong> package tags, tags <strong>voor</strong> drawer tags, en milestones<br />

<strong>voor</strong> fase overgangen van een project.<br />

Tags worden waarschijnlijk direct aangebracht in de drawer, zonder envelope. Ze zijn hun eigen<br />

changeset.<br />

Tags kunnen uit een team-drawer gekopieerd worden in een satellite. De tag-name is bij<strong>voor</strong>beeld<br />

10 augustus 2008, P.M , en het tijdstip waarop de satellite gesynchroniseerd wordt is 11 augustus<br />

2008, 11:30:12. Dit is dan de timestamp van het course-item waarmee de tag-name verschijnt in de<br />

satellite. Als de name gebruikt wordt <strong>voor</strong> een snapshot in de satellite dan wordt bij de name de<br />

timestamp van het event bepaald, en daarmee de timestamp van het snapshot. De name geeft terecht<br />

aan dat het hier een frozen moment betreft die de team-drawer op het aangegeven tijdstip had. Dit<br />

gaat goed als gesynchroniseerd wordt met behulp van de tag. Synchroniseer je met een willekeurige<br />

Pagina: 69 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

timestamp, en wordt daarbij een tag name gekopieerd, dan geeft daarna het gebruik van de tag name<br />

een onbedoeld snapshot in de satellite. Als je synchroniseert op de tip van de team-drawer, dan moet<br />

je <strong>voor</strong>af synchroniseren op de tip-tag, anders is de tip-tag onbruikbaar geworden. Ditzelfde geldt<br />

<strong>voor</strong> baseline-tags. Ook deze worden als laatste gekopieerd als het package wordt gekopieerd,<br />

bij<strong>voor</strong>beeld vanuit de export-drawer van team1 naar de import-drawer van team2.<br />

Een Tag element heeft een name bij<strong>voor</strong>beeld “fortnightly”. Deze name heeft uiteraard een course<br />

of development. Daarnaast heeft elk snapshot dat gedefinieerd wordt (de tag) een name<br />

bij<strong>voor</strong>beeld “baseline 2004-03-12”.<br />

De werkwijze van NXP zal waarschijnlijk toelaten dat tags toegevoegd worden als gewone<br />

elements waar<strong>voor</strong> geldt valid time = transaction time. Omdat één persoon, de build-manager ze<br />

toevoegt aan drawers die alleen hij wijzigt. Dit omdat het werk van ontwikkelaars niet onmiddellijk<br />

wordt toegevoegd aan de courses in de team-drawer, maar eerst een validatie ondergaat, die<br />

uitgevoerd wordt door de build-manager, of door een script van hem dat laat in de avond wordt<br />

uitgevoerd. Bij meer vertrouwen in de werkwijze van de ontwikkelaars kan deze procedure<br />

wijzigen, en zou er een situatie kunnen ontstaan waarin tags worden toegevoegd aan reeds<br />

opgevolgde snapshots, die een validatie hebben doorstaan. Dan geldt bij het plaatsen van de tag dat<br />

transaction time en valid time kunnen verschillen. Maar als de tip van drawer 2 gesynchroniseerd<br />

wordt met een snapshot, dat benoemd is in een tag van drawer 1, dan wordt de tag mee gekopieerd<br />

en geldt valid time = transaction time.<br />

Transactions worden ook wel changesets genoemd. De eerste aanduiding slaat meer op de<br />

handeling, en de tweede op het effect of de inhoud ervan. Net als tags en baselines zijn transactions<br />

een speciaal element. Zo horen echter bij een drawer en je kunt ze niet kopiëren naar een andere. De<br />

changesets zijn de versions van het transaction element. Ze komen zeker niet in een pool maar<br />

horen bij de drawer, en ze zijn niet herbruikbaar. Naast nuttige informatie <strong>voor</strong> gebruikers wordt het<br />

element gebruikt door de repository software om een aantal acties te optimaliseren. Als<br />

geregistreerde snapshots is het een reeks waarin elk snapshot verschilt van zijn <strong>voor</strong>ganger. Tags en<br />

baselines verschillen een geheel aantal changesets (0 of meer) van hun <strong>voor</strong>ganger. Changesets<br />

laten zien wie wat wanneer gewijzigd heeft. In drawers kan er bij een changeset een verwijzing<br />

staan naar een “envelope” staan (zie 2.2.6), of een verwijzing naar een gebruiker, en enig<br />

commentaar.<br />

Als de wijzigingen die in een satellite zijn gemaakt worden overgenomen in de team-drawer, dan<br />

wordt de tip van de satellite overgenomen, of wel de changesets van de satellite worden samengevat<br />

tot één changeset. Als een baseline wordt geplaatst in de export-drawer dan wordt de tip van de<br />

team-drawer overgenomen in de export-drawer, en de changesets in de team-drawer worden<br />

samengevat in één changeset in de export-drawer. Ook als satellites wijzigingen overnemen uit een<br />

team-drawer, dan wordt de tip van de team-drawer overgenomen, met in inachtneming van import<br />

limitations. Ditzelfde geldt als wijzigingen worden overgenomen in de team-drawer vanuit de<br />

import-drawer. Kortom changesets zijn specifiek <strong>voor</strong> een drawer.<br />

Een folder-structuur op een desktop, laptop of server, in het lokale file system, die een kopie is van<br />

een snapshot (meestal een tag of een baseline) van een drawer heet een info-tree. Je kunt wel<br />

wijzigingen aanbrengen in een info-tree, maar die kan je met “commit” niet vastleggen in de<br />

drawer, dat is het enige verschil met een working-tree. Info-trees zijn bij<strong>voor</strong>beeld van belang bij<br />

het analyseren van fouten. Stel een simpele fout: je zapt van het ene naar een ander kanaal en<br />

daarna hoor je geen geluid. Hoe vind je nu de statements in de software die fout zijn, het is zoeken<br />

Pagina: 70 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

naar een naald in een hooiberg? Nou, bij<strong>voor</strong>beeld als volgt:<br />

Met behulp van een info-tree waarin successievelijk verschillende snapshots worden<br />

gedownload, kun je vaststellen wanneer de fout <strong>voor</strong> het eerst optrad. Daarna bepaal je wat<br />

er toen in het <strong>revision</strong> <strong>control</strong> system gebeurd is, en zo vind je de fout. (dit is niet het enige<br />

middel <strong>voor</strong> fouten analyse, maar het is zeker een belangrijk middel). In het open source<br />

system “git” git-scm.com/ vond ik een faciliteit die dit automatiseert, met een algoritme dat<br />

het aantal te gebruiken snapshots minimaliseert.<br />

Je zou een snapshot kunnen zien als een virtuele info-tree. Zo'n virtuele info-tree kun je niet<br />

wijzigen, je kunt er alleen in kijken. In een gewone info-tree kun je eventueel logging inbouwen in<br />

een programma, of een build uitvoeren, die de binaries terug plaatst in de tree. In een virtuele infotree<br />

is dat niet mogelijk: die is read-only.<br />

Als je source code moet wijzigen, dan wil je liever geen fout introduceren. Het is dan nuttig om te<br />

weten waarom de software is zoals hij is. Vaak ontbreekt overzicht en inzicht. Maar het <strong>revision</strong><br />

<strong>control</strong> system moet hier kunnen helpen. Kijk in (virtuele) info-trees van reference en backbone<br />

projects waar en wanneer een software constructie is ontstaan. Kennis over de context waarin de<br />

software constructie is ontstaan kan dan mogelijk behulpzaam zijn bij het verwerven van het<br />

benodigde inzicht en overzicht.<br />

Er zit vaak tijd tussen de ontdekking van een fout en de oplossing ervan. Er kan dan een info-tree<br />

gemaakt worden om de fout te reconstrueren met de software die indertijd is gebruikt.<br />

2.2.5 Other-focused files<br />

Het betreft hier een soort files waarmee, naar ik hoop, een uitbreiding van het gebruik van de<br />

repository mogelijk is. We gaan ermee, als alles goed is, van een source version <strong>control</strong> system naar<br />

een software version <strong>control</strong> system, en mogelijk is er enig zicht op een software project version<br />

<strong>control</strong> system, waarin alle relevante documenten van een project worden bewaard en beschikbaar<br />

gesteld.<br />

De versions van een source file, bij<strong>voor</strong>beeld een c module bevatten tekst. Deze tekst slaat op de<br />

version zelf. De inhoud beschrijft wat de module doet. Een source file is “self-focused”. Een version<br />

van de file in een course of development geeft de state-of-the-art van de file weer, en draagt bij aan<br />

de state of the art van het betreffende snapshot van de drawer. We zeggen ook wel: “valid time =<br />

transaction time”.<br />

Een rapport met test resultaten, een baseline report, een verslag van een vergadering, en zelf een<br />

executable die met een build procedure is gemaakt: ze gaan allemaal over iets buiten henzelf. Deze<br />

files zijn “other-focused”. Een consequentie is dat <strong>voor</strong> het inbrengen van versions niet hoeft te<br />

gelden: “transaction time = valid time”. Het zijn wezenlijk verschillende zaken.<br />

Een tester selecteert bij<strong>voor</strong>beeld 's morgens een snapshot, test de hele dag, en plaatst 's avonds de<br />

test resultaten in de repository. Dan is er geen garantie dat er een snapshot is waarin het geteste en<br />

het testresultaat bijeen staan, tenzij je daar<strong>voor</strong> een aparte valid time gebruikt. Ik vindt het een<br />

goed idee om de test resultaten samen op te slaan bij het snapshot waarop ze betrekking hebben,<br />

maar dit zou niet tot een procedure moeten leiden waarbij de tip van een drawer geblokkeerd blijft<br />

totdat de tests erop klaar zijn. Dus is er een argument om other-focused files te onderkennen, en te<br />

Pagina: 71 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

faciliteren.<br />

Self-focused file versions zijn –, behalve de eerste –, gebaseerd op een <strong>voor</strong>ganger en willen<br />

daarvan verschillen. Other-focused files zijn gebaseerd op een werkelijkheid, en willen daarmee<br />

overeenstemmen (zelfs al zijn ze met copy en paste gemaakt uit een andere file).<br />

Een other-focused file heeft attributes die het subject specificeren waaronder een valid time<br />

attribute, en versions die een transaction timestamp attribute bezitten. De belangrijkste otherfocused<br />

files die thuishoren in een software repository slaan op een snapshot in een drawer. Mijns<br />

inziens bereik je de uitbreiding van een “source <strong>revision</strong> <strong>control</strong>” systeem naar een “software<br />

<strong>revision</strong> <strong>control</strong> system” door een oplossing te bedenken <strong>voor</strong> other-focused files, en dan met name<br />

<strong>voor</strong> de “snapshot-focused” files. We gaan ervan uit dat we deze files beschikbaar stellen in de<br />

drawer, waarin het snapshot <strong>voor</strong>komt. Ook gaan we ervan uit dat dit snapshot altijd een tag of<br />

release is.<br />

Binnen de other-focused files zijn er waarvan het subject buiten de repository ligt. Bij<strong>voor</strong>beeld de<br />

agenda's en verslagen van vergaderingen. Het is mogelijk op het randje om die in een software<br />

repository op te slaan, waarschijnlijk erover, maar goed, ze kunnen meeliften op de <strong>voor</strong>zieningen<br />

die ik wil treffen <strong>voor</strong> de files waarvan het subject zich binnen de repository bevindt. Om ze te<br />

benoemen: ze zijn “externally-focused”.<br />

Ik denk dat er pools van other-focused files komen (één per package per owner subproject) waarin<br />

de files met hun transaction time courses staan. De meeste geordend in strings. In de drawers staan<br />

dan references naar deze files of file-strings. Waarschijnlijk is het voldoende om file-strings te<br />

implementeren, single-shot files zijn dan gereduceerde strings. Die references hebben een course<br />

van names en een course van folder references, maar niet een string van files en geen course van<br />

versions.<br />

Snapshot-focused files bevatten informatie die min of meer intrinsiek te vinden is in het snapshot.<br />

Een executable die gemaakt is van een snapshot is volledig intrinsiek, maar een test document bevat<br />

ook informatie omtrent de TV waarop getest is, de gebruikte audio/video stromen en dergelijke, dus<br />

ook de nodige extrinsieke informatie.<br />

Binnen de other-focused files herkennen we de files die een enkel incident beschrijven: er is slechts<br />

één valid time, maar er zijn misschien wel meerdere versions, <strong>voor</strong>dat de inhoud correct of volledig<br />

was. Deze files zijn “single-shot” files.<br />

Bij<strong>voor</strong>beeld review samenvattingen, of audit resultaten. Executables, baseline reports, test-reports<br />

van daily tests of van baseline tests, verslagen van <strong>voor</strong>tgangsvergaderingen. Ik ben geneigd om<br />

hier<strong>voor</strong> objecten te gebruiken met een valid time course. Zo'n complete course is dan als volgt<br />

gesorteerd: valid time / transaction time, terwijl meestal een subcourse gewenst is: slechts de meest<br />

recente (transaction time) version van een valid time wordt getoond. Deze objecten zijn een<br />

“repetition” van files We zullen ze “file-string” noemen. Een file uit de string heeft een valid time:<br />

het snapshot waarop hij slaat. De versions van de file hebben een transaction time. Twee files uit<br />

zo'n string zijn niet verwant in de zin van kins. Dat neemt natuurlijk niet weg, dat ze erg op elkaar<br />

kunnen lijken. Met de hand gemaakte repetitions zullen dikwijls <strong>voor</strong> een deel met copy en paste uit<br />

<strong>voor</strong>gangers zijn gemaakt.<br />

De string van een other-focused file-string is gesorteerd op valid time als hoofd sorteer-kenmerk.<br />

Pagina: 72 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Daarom hoeft een version die met een nieuwe transaction wordt toegevoegd aan de course niet per<br />

se te belanden in de tip van de string. Dit in tegenstelling tot een self-focused file waarvan de course<br />

altijd wordt uitgebreid aan de tip, immers de transaction time van de nieuwe version is ook de valid<br />

time. Een nieuwe version <strong>voor</strong> een self-focused kin wordt dan ook altijd met “commit” vanuit een<br />

working-tree vastgelegd, terwijl een nieuwe version <strong>voor</strong> een other-focused file kan worden<br />

vastgelegd vanuit zowel een working-tree als een info-tree.<br />

Voor own-drawer-focused files in een string geldt dat ze geen valid time timestamp hebben, maar<br />

Pagina: 73 / 230<br />

Own-drawer-focused file-string<br />

Als een file niet <strong>voor</strong>komt in een snapshot dan moet dat gemarkeerd worden. Als een file geldig is<br />

<strong>voor</strong> meerdere snapshots dan moet dat aangegeven worden in de string.<br />

Het model kan eventueel vereenvoudigd worden door slechts de meest recente versie op te slaan<br />

van een file in de string.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

een tag reference attribute. Per tag reference kunnen er diverse versions zijn, met een verschillende<br />

transaction time timestamp, waarvan de meest recente geacht wordt de meest correcte te zijn.<br />

Sortering op tag levert niet per se een sortering op valid time op en is dus geen time sequence, maar<br />

blijft een set. De uiteindelijke string wordt bepaald in de drawer, waar het tag-element een course<br />

heeft. De course van het tags bepaalt de definitieve course van de file-string in de drawer.<br />

Er zijn twee presentatie opties <strong>voor</strong> file-strings. In een working-tree of info-tree kan gelden dat alle<br />

repetitions getoond moeten worden in een folder die genoemd is naar de file-string, terwijl de files<br />

in de folder genoemd zijn naar hun valid time reference. Dit kan bij<strong>voor</strong>beeld gelden <strong>voor</strong> alle<br />

baseline reports, of alle verslagen van meetings. Maar ook kan gelden dat slechts de occurrence van<br />

het snapshot getoond moet worden. Dit geldt bij<strong>voor</strong>beeld <strong>voor</strong> build targets, of test results. Maar<br />

dit kan ook gelden <strong>voor</strong> baseline reports, en ook verslagen kunnen ook als single getoond worden.<br />

Dan wordt de name van de file-string gebruikt <strong>voor</strong> de file zelf, en wordt er geen file-string folder<br />

gemaakt.<br />

Stel in een team drawer werd een nieuwe baseline van een package geplaatst. Na een tijdje bleek dit<br />

zoveel problemen te geven, dat men besloot om terug te keren naar de vorige baseline. Voor de<br />

course van de baseline tags betekent dit bij<strong>voor</strong>beeld de volgorde …, Rn, Rn+1, Rn, Rn+2, ... Dit<br />

geldt dus ook <strong>voor</strong> de string van de baseline reports in de drawer.<br />

Build Targets: Ze kunnen pas gemaakt worden als het snapshot met source files klaar is, daarna<br />

kan de build ze zo lang duren, dat er reeds wijzigingen zijn aangebracht in de drawer. Over het<br />

algemeen maakt een build manager het target, en slaat het op in de team-drawer, of in de exportdrawer.<br />

Anderen kunnen inmiddels reeds transfers uit de satellites hebben gerealiseerd. Om die<br />

reden behandelen we ze als own-drawer-focused. Ze worden gemaakt in een info-tree. Een<br />

bijkomend <strong>voor</strong>deel is misschien dat je de builds kunt herstellen in het snapshot waar<strong>voor</strong> ze<br />

bedoelt zijn. Onder andere het volgende kan mis gaan:<br />

● De info-tree was vervuild met wijzigingen<br />

● Er waren foute opties meegegeven aan het build script<br />

Er zijn build targets die geëxporteerd worden. Dan worden ze zowel in baselines als in baseline<br />

supplements geëxporteerd. De betreffende tags moeten dus ook bijgehouden worden <strong>voor</strong> zowel de<br />

baselines als de baseline supplements.<br />

Complete build resultaten, met alle derived files: Het kan nuttig zijn om deze op te slaan, om te<br />

vermijden dat ontwikkelaars veel clean builds moeten uitvoeren.<br />

Baseline reports: Ze kunnen worden <strong>voor</strong>bereid <strong>voor</strong>dat er een baseline tag bestaat in de export<br />

drawer, want zo'n baseline is planbaar. De satellite waarin het baseline report wordt <strong>voor</strong>bereid<br />

moet dan het betreffende tag-element reeds bevatten. In de betreffende satellite geldt dan strikt<br />

genomen niet dat het report own-drawer-focused is, immers het snapshot in de satellite voldoet niet<br />

per se aan de specificaties van het baseline report. Een bijkomstigheid: een fout is nog te herstellen.<br />

De herstelde file vervangt de foute file in het baseline snapshot.<br />

Component descriptions en Interface descriptions: in principe is dit documentatie over een<br />

component, of een interface, bedoeld om implementatie perikelen te beschrijven, <strong>voor</strong> de software<br />

engineer die de component als server <strong>voor</strong> zijn client software gebruikt, of die de interface gebruikt.<br />

Als zodanig lijken deze files in aanmerking te komen als other-focused files. Maar nieuwe files zijn<br />

wel gebaseerd op <strong>voor</strong>gangers als je ze wijzigt, ze nemen deel aan een ontwikkelingsgang. Ook wil<br />

Pagina: 74 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

je soms versions of wijzigingen overnemen uit sister projects. In de projects waarin ik werkte zijn<br />

de gebruikers te overzien, en een fout hoeft niet per se hersteld te worden in de baseline, of in het<br />

snapshot. Zelfs als de gebruikers niet zijn te overzien, kunnen wijzigingen via de normale verbeter<br />

procedures worden gedistribueerd. Daarom implementeren we ze als self-focused files. We<br />

reserveren other-focused files alleen <strong>voor</strong> die files waar<strong>voor</strong> het bijna niet anders kan.<br />

Argumenten <strong>voor</strong> het onderkennen van other-focused files zijn onder meer:<br />

● Er moet reeds een snapshot zijn, waarop de file slaat<br />

● Er is sprake van een file-string.<br />

● Er moet correctie mogelijk zijn in hetzelfde snapshot<br />

Slot opmerkingen.<br />

● Over het algemeen is het zo dat een file-string niet per se na iedere toevoeging aan de tip-tag<br />

van een package opnieuw moet worden uitgebreid met een nieuwe file <strong>voor</strong> de betreffende<br />

valid time. Dus in snapshots die volgen blijft de oude file zichtbaar, totdat er een snapshot<br />

komt waarin deze vervangen is. Ook kan het <strong>voor</strong>komen dat je het éne moment een snapshot<br />

bekijkt, en je ziet een oude version, en de volgende dag bekijk je het snapshot, en nu zie je<br />

een nieuwere version. Deze version kan tot dezelfde file behoren, en dus dezelfde valid time<br />

hebben als zijn <strong>voor</strong>ganger.<br />

● Soms is er source file. Dan komt iemand op het idee om de file te genereren, en is het niet<br />

langer een source file, maar een derived file en dus mogelijk een file-string. <strong>Climbexion</strong><br />

heeft <strong>voor</strong>lopig geen faciliteiten om een file naadloos te laten overgaan in een file-string<br />

(visa versa).<br />

● “IBM Rational ClearCase” is een <strong>revision</strong> <strong>control</strong> systeem waarin ook build resultaten<br />

kunnen worden opgeslagen. (in een VOB, wat staat <strong>voor</strong> Versioned Object Base). “Odin” is<br />

een build systeem waarmee meerdere versies en varianten van build resultaten kunnen<br />

worden opgeslagen naast een source <strong>revision</strong> <strong>control</strong> system.<br />

● De architecten van NHSW bedachten een folder structuur waarin self-focused en snapshotfocused<br />

files beiden <strong>voor</strong>komen. Nu <strong>Climbexion</strong> NHSW gebruikt als uitgangspunt, is het<br />

logisch dat hieraan aandacht wordt besteed.<br />

2.2.6 Envelopes<br />

In Synergy kent men tasks. Een task verwijst naar een problem report, change request of planning<br />

item, of een andere werk opdracht. Als je zo'n problem report of ander item oplost, dan zie je dat<br />

toch <strong>voor</strong>al als een stukje arbeid. We zullen ze daarom work-item noemen.<br />

Bij een overdracht van wijzigingen vanaf een satellite naar een team-drawer, staan de wijzigingen in<br />

de task. De task wordt <strong>voor</strong>gedragen en als alles goed gaat overgedragen. De overdracht van een<br />

task is een transaction, (een atomaire wijziging).<br />

Ook het inlijven van een nieuwe baseline in een team-drawer is een task.<br />

Wijzigingen, die van het ene project doorgevoerd worden in het andere, gebeuren door een task te<br />

kopiëren, en mogelijk, de kopie te modificeren.<br />

In <strong>Climbexion</strong> zullen we spreken over een envelope in plaats van een task. Want task is een begrip<br />

uit het planning en tracking gebeuren. Een envelope is <strong>voor</strong> vervoer, waar een folder is <strong>voor</strong><br />

opbergen op een vaste plaats. Een envelope doorloopt stadia: Preparation, Transferred, Unallocated,<br />

Pagina: 75 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Rejected, Implemented. Bij de meeste stadia hoort een drawer waarin de wijzigingen zijn<br />

aangebracht die in de envelope staan. De drawers waartussen de envelope pendelt behoren tot<br />

dezelfde constellation.<br />

Te overwegen valt het woord “briefcase” <strong>voor</strong> envelope. Dit woord laat zich vertalen als aktetas,<br />

en is mogelijk wat minder geassocieerd met mail en messages, dus met andere begrippen uit<br />

groupware en project management.<br />

Naast de wijzigingen staan in de envelope de base versions, base names, en base folder references,<br />

zoals aangegeven door het team member, of zoals afgeleid door de SCM software. Dus: de nieuwe<br />

version x van element A is bedoeld als wijziging op de base version b. De gewijzigde name, of<br />

folder reference of version noemen we labored. De base version is ter <strong>control</strong>e. Als een labored<br />

version wordt overgedragen naar de team-drawer dan moet de base version gelijk zijn aan de tip<br />

version van de team-drawer.<br />

Zodra iemand begint aan het uitvoeren van een oplossing, maakt hij een envelope aan, of hij<br />

ontvangt de envelope van een <strong>voor</strong>tgangsmanager. De te wijzigen files en hun course-item in de<br />

team-drawer worden toegevoegd aan de envelope: dit is de basis van de wijzigingen. In feite wordt<br />

niet de timestamp van het course-item toegevoegd aan de envelope, maar name, folder reference of<br />

version-id, afhankelijk van de aard van de wijziging. De file in de team-drawer wordt er (virtueel)<br />

door gemarkeerd, en een relatie wordt gelegd met het team member. Hierdoor moet het <strong>voor</strong> ieder<br />

team member zichtbaar zijn dat er aan de file wordt gewerkt. Overleg kan plaats vinden als een<br />

ander de file reeds heeft gemarkeerd. Deze markering zorgt <strong>voor</strong> een zo vroeg mogelijk inzicht in<br />

problemen met parallel updates. Als een envelope wordt overgedragen, is ook dit zichtbaar <strong>voor</strong><br />

iedereen, want dan komen de labored resultaten beschikbaar. Iemand die zijn envelope wil<br />

overdragen en ziet dat een file inmiddels is gewijzigd moet een mogelijkheid krijgen om zijn<br />

wijzigingen te baseren op het te verwachten, of<br />

mogelijk reeds gerealiseerde nieuwe courseitem.<br />

De markering schuift dan naar dit nieuwe<br />

item.<br />

Pagina: 76 / 230<br />

Envelope state diagram<br />

State transitions worden gerealiseerd in<br />

passages<br />

Er is een speciale satellite, de transfer-drawer.<br />

Deze begint de dag, als alles goed gaat, met<br />

dezelfde tip als de team-drawer. De inhoud van<br />

envelopes die worden overgedragen wordt hierin<br />

meteen tijdens overdracht geplaatst, waarbij<br />

<strong>control</strong>e plaatsvindt of elk element in de<br />

envelope wel de juiste basis heeft dat wil zeggen<br />

dat de wijziging gebaseerd moet zijn op de tip<br />

van de transfer-drawer, anders wordt de hele<br />

envelope geweigerd. 's Avonds als een acceptatie<br />

test goed verloopt dan worden de verzamelde<br />

envelopes één <strong>voor</strong> één overgedragen naar de<br />

team-drawer. 's Nachts wordt een nieuwe tag<br />

<strong>voor</strong> de team-drawer aangemaakt. Mocht er een<br />

fout optreden in de acceptatie test dan kan<br />

besloten worden om een envelope te weigeren.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

De transfer-drawer wordt dan opnieuw gesynchroniseerd met de team-drawer en de envelopes<br />

worden opnieuw aangebracht, behalve de geweigerde. Eventuele afhankelijke envelopes, met<br />

elements die geen geldige basis meer hebben, omdat ze gebaseerd zijn op de geweigerde envelope<br />

worden dan eveneens geweigerd. Nadat een envelope is overgedragen naar de team-drawer is hij<br />

geïmplementeerd.<br />

Opmerking: de acceptatie test is slechts een deel van de daily test (regressie test). Niet alle projects<br />

gebruiken een acceptatie test en vaak alleen in de development fase. Wel worden er altijd ter<br />

acceptatie bepaalde builds uitgevoerd, die zonder compilatie-fouten moeten verlopen.<br />

Strikt genomen is een transfer-drawer niet nodig, omdat envelopes ook uitgeschakeld kunnen<br />

worden in de center-drawer, door de courses uit te breiden met events waarin de wijziging<br />

ongedaan wordt gemaakt. Door dit in een transfer-drawer te doen, blijven echter de courses in het<br />

center meer toegespitst op hun gebruik bij het vinden van fouten. Dit gaat dan ten koste van project<br />

evaluaties, waar je ter lering en vermaak graag de onvolkomenheden bij (de <strong>voor</strong>bereiding van)<br />

transfers in kaart brengt, maar die zijn terug te vinden in de transfer-drawer.<br />

De acceptatie test is geen volledige regressie test, maar meer een soort garantie dat de software<br />

bruikbaar is <strong>voor</strong> tests en debugging. Het is een “unattended test”, die geen menselijke waarneming<br />

of handeling behoeft. TV en Image generators worden aangestuurd door het test-script en in plaats<br />

van beeld- en geluid- waarnemingen door mensen vergelijkt het script variables en notifications met<br />

een norm. (De term “in plaats van” die ik gebruikte is een slordigheid In een “attended test” kunnen<br />

ook variables en notifications worden vergeleken met een norm, maar daarnaast kunnen ook<br />

menselijke handelingen worden uitgevoerd, en menselijke geluid en beeld waarnemingen bijdragen<br />

aan het test resultaat). Behalve de binary <strong>voor</strong> de test op een platform worden ook een aantal andere<br />

binaries (executables) gemaakt. Als één zo'n build mislukt, dan is dat dezelfde soort situatie als<br />

wanneer de test mislukt, en wordt er navenant gehandeld.<br />

Een envelope start zijn leven in een satellite. Bij iedere transitie verhuist hij naar een andere drawer.<br />

Deze transities vormen een course of development. Bij iedere transitie behoort de inhoud zoals die<br />

tot dan toe is bijgehouden. Deze inhoud is vanaf dat moment frozen. In de state “Preparing” kan een<br />

inhoud worden <strong>voor</strong>bereid die frozen is na transitie. Nieuwe wijzigingen vervangen niet de frozen<br />

content, maar worden opgebouwd <strong>voor</strong> een nieuwe transities. Bij envelopes spreken we over<br />

passage in plaats van snapshot bij zo'n state overgang. Bij een passage hoort een bepaalde<br />

changeset, die is toegespitst op de ontvangende drawer, tenminste als er niet sprake is van een terug<br />

verwijzing, of een <strong>voor</strong>tijdige beëindiging. In het state diagram zijn state overgangen gekleurd die<br />

een changeset toevoegen aan een drawer. De events die een state overgang uitlokken zijn menselijke<br />

beslissingen die gerealiseerd worden door <strong>Climbexion</strong> commands. Alleen de overgangen naar de<br />

end state zijn automatisch (en ogenblikkelijk).<br />

Een satellite kan op een aantal manieren gewijzigd worden. Sommige wijzigingen vereisen een<br />

envelope, andere niet. Sommigen wijzigen een bestaande envelope, andere niet. In principe zijn alle<br />

acties die gegevens uit de team-drawer in de satellite kopiëren, en alle acties die gegevens uit<br />

andere drawers in de satellite kopiëren wijzigingen die niet via een envelope komen: het zijn<br />

autonome changesets. Wel kunnen dergelijke wijzigingen de envelope wijzigen die wordt<br />

<strong>voor</strong>bereid <strong>voor</strong> overdracht.<br />

● Synchronisatie met de team-drawer realiseert het snapshot van zijn tip-tag in de satellite en<br />

de working-tree: er ontstaat een nieuwe basis <strong>voor</strong> wijzigingen. Een gewijzigde basis kan de<br />

envelope wijzigingen, de merge van een <strong>voor</strong>heen reeds gewijzigde file, en de nieuwe tip,<br />

Pagina: 77 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

met de vorige base als original kan daarna de envelope wijzigen. Voor de begrippen base,<br />

merge, original: zie de sectie over merging: 2.4.1<br />

● Er wordt niet alleen gesynchroniseerd met de tip-tag. Synchronisatie met de (verwachte) tip<br />

wijzigt satellite en working-tree. Een gewijzigde basis kan een envelope wijzigen. Een<br />

daarop volgende merge ook.<br />

● Manueel wijzigen van names en folder references. Dit gebeurt met <strong>Climbexion</strong> software.<br />

Ook de dood van een element wordt zo gerealiseerd. Dit wijzigt de working-tree. Om de tip<br />

van de satellite te wijzigen moeten de wijzigingen daarna of gelijktijdig worden vastgelegd.<br />

Sommige wijzigingen worden vastgelegd in de envelope, en dus in de satellite, en sommige<br />

worden eerst alleen in de satellite vastgelegd, en later mogelijk in de envelope.<br />

● Manueel wijzigen van names en verplaatsen van elements in de working-tree met andere<br />

dan <strong>Climbexion</strong> tools, moet worden ontraden, maar is niet uit te sluiten. Dergelijke<br />

wijzigingen kunnen met gecompliceerde commits worden vastgelegd.<br />

● Wijzigen of nieuw creëren van een file met een editor wijzigt de working-tree, daarna kan<br />

de file vastgelegd worden in de drawer, en mogelijk in de envelope.<br />

● In de working-tree kunnen files gewijzigd worden door het resultaat van query's in<br />

beschikbare <strong>Climbexion</strong> drawers. Dit betekent in eerste instantie: geen wijziging in een<br />

envelope. Pas als de files vastgelegd worden, wordt de envelope bijgehouden. Overigens<br />

moet deze methode worden afgeraden, omdat zo geen herkomst relaties kunnen worden<br />

gedetecteerd door <strong>Climbexion</strong>.<br />

● Door dergelijke queries vast te leggen in envelopes is er een herkomst relatie, en een lijst<br />

van wijzigingen die moeten worden geïncorporeerd.<br />

Bij iedere passage kan een andere persoon betrokken zijn. Dit moet geregistreerd worden in<br />

envelope. Er kunnen 2 personen betrokken zijn bij een implementatie, een software ontwikkelaar in<br />

het stadium preparing brengt de envelope in het stadium transfered, en een build manager brengt de<br />

envelope in het stadium implemented. Deze mensen worden geregistreerd in de envelope. Een<br />

envelope die 20 passages meemaakt, zal mogelijk 21 namen bevatten: één per transfer, en de naam<br />

van degene <strong>voor</strong> wie de envelope nu preparing is.<br />

Om een envelope over te hevelen van de ene ontwikkelaar naar de andere, zal de ene hem in het<br />

stadium unallocated brengen, Nu is hij beschikbaar <strong>voor</strong> een <strong>voor</strong>tgangsmanager, die hem opnieuw<br />

kan toewijzen. Daarna zal de envelope door de ontwikkelaar worden gebonden aan één van zijn<br />

satellites, en opnieuw preparing zijn.<br />

Het binnenhalen van een package in de import-drawer, en het plaatsen van een package in een<br />

export-drawer vindt plaats met een envelope die minder stadia doorloopt. Ook het initieel vullen en<br />

op orde brengen van een team-drawer kan plaatsvinden met envelopes die minder stadia doorlopen,<br />

omdat er nog geen eisen worden gesteld aan het center-drawer, zoals “compileerbaar”, of<br />

“doorstaat test”. Er komen waarschijnlijk speciale envelopes <strong>voor</strong> het binnenhalen van package<br />

baselines in de import-drawer, of het kopiëren van een package baseline in een export-drawer. Die<br />

zijn waarschijnlijk simpeler dan een envelope met volledige stadia <strong>voor</strong> de team-drawer.<br />

Eén enkele envelope kan slecht wijzigingen bevatten <strong>voor</strong> één package. Voor complexe wijzigingen<br />

vanuit één satellite kunnen soms een aantal bij elkaar horende envelopes nodig zijn: er is er<br />

minstens één per package. De envelopes uit zo'n groep worden comrades genoemd. Er wordt een<br />

comrade volgorde vastgelegd zodat eventueel een labored version in de ene envelope kan dienen als<br />

base in een volgende.<br />

Pagina: 78 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Naast comrades die samen en tegelijkertijd, als één transaction worden overgedragen, kan het nog<br />

<strong>voor</strong>komen dat een work-item niet meteen goed is opgelost met één envelope. Later start dan een<br />

andere envelope, waarmee het probleem hopelijk wel goed wordt opgelost. Deze envelopes vormen<br />

een succession. Tenslotte kan er een relatie bestaan tussen envelopes als de één de wijziging van de<br />

ander overneemt, zodat de wijziging gerealiseerd wordt in binnen twee constellations. De ene is de<br />

model envelope, en de andere de adopt envelope.<br />

Een <strong>voor</strong>beeld van een envelope is te vinden in sectie 3.3.1<br />

2.2.7 Baseline supplements, external envelopes<br />

In <strong>Climbexion</strong> zijn “baseline supplements” het smeermiddel waardoor de teams onderling min of<br />

meer onafhankelijk kunnen bewegen. Er zijn een aantal scenario's waarin deze patches nuttig zijn:<br />

● Nadat een baseline is uitgegeven wordt een fout ontdekt die de <strong>voor</strong>tgang van testers of<br />

ontwikkelaars ernstig belemmerd, of mijlpaal audits laat stranden, of een certificaat<br />

aanvraag of deelname aan een beurs frustreert.<br />

● Een wijziging vraagt een aanpassing in de packages van 2 teams. Het ene team gebruikt een<br />

tijdelijke wijziging in een package van de ander (en het ander mogelijk een tijdelijke<br />

wijziging in een package van het éne).<br />

● Een team gebruikt een bepaalde (ongebruikelijke) combinatie van baselines van packages<br />

die een incompatibiliteit opleveren, het smeermiddel maakt dat ze er nog even mee door<br />

kunnen gaan. Soms wil/moet een team zich concentreren op de eigen software ontwikkeling,<br />

en wil zich dan niet bezighouden met het invoeren van de baselines van van andere teams.<br />

Dan kan er een probleem ontstaan dat opgelost wordt met baseline supplements.<br />

Vaak zijn baseline supplements een middel om <strong>voor</strong>t te gaan als plannen mislukken.<br />

Baseline supplements zijn –, het woord zegt het al –, een aanvulling op baselines.<br />

Soms is een baseline supplement onafhankelijk, soms is een combinatie van supplements nodig.<br />

Bij<strong>voor</strong>beeld als meerdere packages in combinatie moeten worden gewijzigd, of als supplement<br />

over supplement <strong>voor</strong>komt.<br />

Bij baseline supplements geldt: De changeset komt te staan in een external envelope <strong>voor</strong> een<br />

wijziging die wordt aangebracht door een team op een package waarop het is geabonneerd. Vaak<br />

wordt de changeset ontwikkeld door het team dat er behoefte aan heeft, maar het team dat<br />

verantwoordelijk is <strong>voor</strong> het package is eindverantwoordelijk en geeft de external envelope uit. Een<br />

baseline supplement bevat een “external” envelope omdat een internal envelope circuleert binnen<br />

een specifiek met name genoemde constellation. Waarom een envelope en niet simpel weg een<br />

changeset? Wel dit is met het oog op wijziging over wijziging, en wijzigingen die in meerdere<br />

baselines moeten worden gerealiseerd, er is vaak een mogelijkheid om dit te realiseren met<br />

meerdere base/labored paren in de external envelope.<br />

Bij een baseline supplements hoort een “sheet” met de volgende inhoud:<br />

● Identificatie van het supplement.<br />

● Het subproject en de identificatie van degene die hem uitgeeft.<br />

● Package en baseline(s) waarop het supplement kan worden toegepast.<br />

● Het probleem dat met het supplement wordt opgelost.<br />

● Baselines van andere packages dan die waarin het supplement functioneert.<br />

● Andere supplements die ook moeten worden geïmplementeerd.<br />

Pagina: 79 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

● De baseline waarin het supplement niet meer nodig is.<br />

● De overeenkomstige supplements <strong>voor</strong> andere baseline combinaties van eigen en andere<br />

packages.<br />

De external envelope die bij een supplement hoort wordt gemaakt in een satellite van een drawer<br />

waarin alle baselines van het betreffende package worden bewaard: de baseline-drawer. Er vindt<br />

misschien een overdracht plaats naar de center-drawer, maar zeker naar het patch registratie system,<br />

en vandaar naar de team-drawers van de teams die er behoefte aan hebben. Waarschijnlijk komt de<br />

sheet in het patch registratie systeem van het master project, maar komen de bijbehorende<br />

envelopes in hun export pools, om van daar uit verstuurd te worden naar ieder die er om vraagt.<br />

Ook de baselines van packages zouden mogelijk in dit systeem geregistreerd moeten staan, met een<br />

verwijzing naar de export drawers, en misschien met een uittreksel (een sheet) van het baseline<br />

report. Het wordt dan een baseline en patch registratie systeem.<br />

In de satellite vindt eerst een query plaats waarmee een baseline combinatie van packages wordt<br />

gerealiseerd als basis waarop de wijziging moet plaatsvinden, eigen packages komt waarschijnlijk<br />

uit de baseline-drawer, de overigen mogelijk uit import-drawers.<br />

De gewijzigde files zelf en de external envelope kunnen worden aangeleverd aan de integrator door<br />

een team waarin ze zijn uitgeprobeerd, of ze worden gemaakt door of namens de integrator van het<br />

team dat de envelope uitgeeft.<br />

Als een ander team de external envelope <strong>voor</strong>bereidt dan is er een mogelijk een half security<br />

probleem: normaal wijzig je als team alleen je eigen packages. Nu wordt van een team verlangd dat<br />

het wijzigt in het package van een ander. De nieuwe versions komen nu niet via importeren bij de<br />

package owner vandaan, maar verschijnen via “commit” in de version pool van degene die de<br />

external envelope maakt. De owner van het betreffende package heeft in principe geen autorisatie<br />

over een pool die in beheer is bij een ander team, dus er is geen harde protectie tegen lokale<br />

wijzigingen, hoogstens kan een team zelf een protectie instellen om zichzelf te behoeden <strong>voor</strong><br />

ondoordacht wijzigingen in andermans package. Het is dan deze security die tijdelijk moet worden<br />

uitgeschakeld.<br />

Pagina: 80 / 230<br />

Een baseline supplements scenario


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

Er wordt een baseline supplement gemaakt zonder export limitations. Daar worden supplements<br />

vanaf geleid, met export limitations die behoren bij de toegangsrechten van de subprojects.<br />

Het systeem dat baseline supplements toegankelijk en onderhoudbaar maakt, het patch registratie<br />

systeem, is een klein onderdeel van het software configuration management systeem, maar geen<br />

onderdeel van <strong>Climbexion</strong>.<br />

In sommige stadia worden wijzigingen niet per baseline maar per changeset doorgegeven naar<br />

andere teams<br />

● In het allerlaatste project stadium, als de projectleider van het master project volledige<br />

beheersing wil over de laatste wijzigingen, dan kan hij eisen dat alle wijzigingen<br />

doorgegeven worden als basic changesets, in plaats van baselines.<br />

● Tijdens een “field test” gaat een groepje engineers een (wereld) reis maken om op “locatie”<br />

de TV te testen. De problemen die ze vinden worden door de thuisbasis zo snel mogelijk<br />

opgelost, en de oplossingen worden zo snel mogelijk doorgegeven aan de field testers. De<br />

teams van de thuisbasis wisselen hier wijzigingen uit door middel van basic changesets.<br />

In deze gevallen is er sprake van een gewone external envelope, die met een sterk vereenvoudigd<br />

sheet wordt aangeleverd aan het patch systeem.<br />

In zo'n laatste stadium is sprake van zuiver distributed SCM. Maar toch blijven de teams daarnaast<br />

nog baselines uitgeven, compleet met baseline tests en baseline reports. Dit gebeurt om zicht te<br />

houden op het bereikte stadium, en om de kwaliteit van de software te waarborgen. Daarom wordt<br />

de baseline als test en verificatie discipline gehandhaafd.<br />

2.2.8 Resources<br />

In zijn algemeenheid geldt dat resources identificeerbaar zijn met een URL<br />

1. Kin Pools<br />

Lichtzinnig heb ik er<strong>voor</strong> gekozen om entity types, en misschien toegestane names en folder<br />

references op te nemen bij kins. Hierdoor zijn het objecten geworden die moeten worden<br />

opgeslagen. Indien we ervan afzien zouden het codes zijn die bij het kopiëren mee gekopieerd<br />

worden. Opgeslagen kins: één centrale database per package. Eigenaar van een package database is<br />

de party van het subproject. Om security redenen, ten behoeve van beschikbaarheid en<br />

performance, en om garbage collection te vermijden zou men kunnen werken met local pools <strong>voor</strong><br />

bepaalde locaties. Naast een centrale pool kunnen er local pools worden gebruikt op Pc's en bij third<br />

parties. Local pools op Pc's bedienen de satellites en mogelijk de clones op de PC, Uittreksels bij<br />

andere subprojects bedienen daar de import-drawers, en development drawers. Er is dan een<br />

gedistribueerde discipline wenselijk, met name om gewijzigde attributes aan elkaar door te geven .<br />

2. Version pools<br />

Hier<strong>voor</strong> geldt in principe hetzelfde: een centrale opslag capaciteit per package. Deze opslag wordt<br />

niet toegankelijk gemaakt door een database server maar door een file server. Echter de<br />

toegangsrechten worden bepaald door de rechten in de drawers en packages waarin de versions<br />

worden gebruikt. In principe zijn er twee soorten recht: het recht om een version te lezen, en het<br />

recht om een version toe te voegen. Om security redenen, ten behoeve van beschikbaarheid en<br />

performance, en om garbage collection te vermijden op de centrale pool zou men kunnen werken<br />

met local pools. Hier<strong>voor</strong> geldt hetzelfde als <strong>voor</strong> kins. Mogelijk is er een gecombineerde pool <strong>voor</strong><br />

Pagina: 81 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

versions en kins. Het werken met local pools betekent wel, dat er bij overdrachten en<br />

synchronisaties niet alleen versies gekopieerd worden van of naar working-trees, maar dat er ook<br />

gekopieerd wordt tussen pools. Indien men strikt met local pools werkt, zou de centrale pool geen<br />

content hoeven te bevatten, maar uitsluitend attributes. Deze centrale pool speelt dan een rol bij het<br />

doorvoeren van attribute wijzigingen.<br />

Een probleem met local pools wordt veroorzaakt door de attributes. Dit geldt <strong>voor</strong> versions en <strong>voor</strong><br />

kins. Normaal worden pools bijgewerkt door synchronisaties van drawers of packages, of door<br />

transfers, of omdat satellites worden bijgehouden vanuit working-trees (commit). Hierbij zijn een<br />

tweetal drawers betrokken, of een drawer en een working-tree. Wordt echter een attribute<br />

bijgewerkt in een (local) pool, dat moeten de attributes worden bijgewerkt in alle local pools van<br />

het package, tenminste als daar de version of de kin <strong>voor</strong>komt. Er zijn wat implementatie<br />

mogelijkheden:<br />

1. Er is een push mechanisme zonder dat een specifiek target is opgegeven door een gebruiker.<br />

Alle locations kunnen target zijn, en moeten bekend zijn in het climbexion systeem.<br />

2. Er is een pull mechanisme. Alle locations waarin deze attributes kunnen wijzigen moeten<br />

bekend zijn in de location die zijn pools up-to-date brengt<br />

3. Een push /pull combinatie: een push naar een universeel bereikbare location vindt plaats in<br />

de location waar een attribute is gewijzigd, een pull vindt (periodiek) plaats in iedere<br />

location. Daar worden de wijzigingen getrokken uit de universeel bereikbare location. Ieder<br />

package kan zijn eigen center location alloceren. Als een kin of version <strong>voor</strong> het eerst<br />

gekopieerd wordt vanuit de ene location naar de andere, dan wordt ook de center location<br />

bijgewerkt met die kin of met die version. Wordt daarna een attribute gewijzigd dan wordt<br />

dit doorgegeven naar de center location. Als een kin of een version niet te vinden is in de<br />

center location, dan wordt een lokale attribute wijziging ook niet doorgegeven. Deze derde<br />

methode zal waarschijnlijk worden geïmplementeerd, omdat die nauwelijks administratie<br />

vereist.<br />

4. Een universeel bereikbare plaats <strong>voor</strong> het doorgeven van version attributes, hoeft zelf geen<br />

version content te bevatten, alleen de identifier en de attributes volstaat.<br />

3. Packages.<br />

De centrale pools van een package staan op een location met een package gerelateerde URL Het<br />

package is onder meer identificeerbaar met behulp van deze URL<br />

4. Pools <strong>voor</strong> other-focused files.<br />

Wijzigingen moeten worden doorgevoerd in locale pools en in working-trees en info-trees. Ook<br />

hier<strong>voor</strong> is een goede push/pull discipline nodig, en goede hulpmiddelen om de discipline te<br />

realiseren.<br />

5. Pools <strong>voor</strong> envelopes.<br />

Envelopes horen bij het subproject, bij de drawer constellation waarbinnen ze de wijzigingen<br />

transporteren, ze staan in een constellation gerelateerde pool. Ze kunnen ontstaan op een laptop,<br />

maar zodra hun inhoud publiek is moeten ze ook zijn geplaatst in een constellation pool. In het<br />

stadium “prepared” wordt in de constellation pool de envelope bijgehouden met de base items<br />

waarop gewijzigd gaat worden. Op de PC wordt een pool bijgehouden waarin ook de labored items<br />

staan. Bij de overgang naar “transfered” wordt de envelope in de constellation pool <strong>voor</strong>zien van de<br />

labored items.<br />

Pagina: 82 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.2 Begrippen<br />

6. Pools <strong>voor</strong> external envelopes.<br />

De external envelope ontstaat als een gewone envelope in een constellation pool, en wordt<br />

gekopieerd in een (master) project pool. Sheets kunnen waarschijnlijk ontstaan en blijven in een<br />

(master) project database, want er zijn allerlei query's op de verzameling sheets, bij<strong>voor</strong>beeld welke<br />

patches zijn er op baseline X van subsysteem S of welke patches kunnen er zijn op andere packages<br />

als ik baseline X van package S implementeer. Het database systeem waarin de sheets release<br />

supplements (en misschien ook die van releases) worden bewaard valt buiten de scope van<br />

<strong>Climbexion</strong>.<br />

7. Drawers.<br />

Een drawer wordt gealloceerd in een file system. Waarschijnlijk behoeven packages geen<br />

zelfstandige allocatie, maar kunnen ze deel uitmaken van de drawer. Een drawer kent een aantal<br />

structuren. In de eerste plaats is een drawer een lineaire structuur van packages. Een package heeft<br />

een content van elements, elements hebben een development course, en zijn mogelijk gegroepeerd<br />

per soort: files bij files, folders bij folders, cross references bij elkaar, package references bij elkaar.<br />

Dan is elk package te zien als een opeenvolging van changesets, en tenslotte is elk snapshot in een<br />

package te zien als een folder-tree, Een tag is een snapshot over alle packages in een drawer met een<br />

integrale folder tree.<br />

8. Parties, teams, users, projects registration.<br />

Misschien is het zinvol om hier ook een URL <strong>voor</strong> te reserveren. Iedere party heeft hier<strong>voor</strong> een<br />

eigen administrator database. Daarnaast kunnen er registraties nodig zijn in de computers met<br />

drawers en pools. Systeembeheerders, bij<strong>voor</strong>beeld providers van services hebben namelijk ook hun<br />

eigen administrator, en security faciliteiten.<br />

9. Files, folders, en andere elements<br />

Ze worden geïdentificeerd door hun kin en hun drawer. Snapshots die naar buiten komen, in infotrees<br />

of working-trees krijgen hun eigen path-name. Ze worden over het algemeen lokaal<br />

geïdentificeerd.<br />

10. Tenslotte<br />

Van iedere resource bestaat minstens één kopie. Meerdere kopieën op meerdere plaatsen zijn<br />

mogelijk als de betreffende file of database server daarin <strong>voor</strong>ziet. Voorlopig zullen hoogstens<br />

beperkte <strong>voor</strong>zieningen worden getroffen <strong>voor</strong> lokale kopieën die door <strong>Climbexion</strong> worden<br />

bijgehouden.<br />

Een vertaling van een package, een party, een team , een project of een combinatie hiervan in een<br />

URL gebeurt met gegevens die geleverd worden vanuit de administrator database.<br />

Het kan <strong>voor</strong>komen dat een version in een satellite uiteindelijk niet overgedragen wordt, en mag<br />

vervallen als de satellite wordt opgeschoond of opgedoekt. Hetzelfde geldt <strong>voor</strong> envelopes. Dit<br />

vindt plaats in pools van de betreffende location.<br />

Pagina: 83 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

2.3 Metadata<br />

2.3.1 Inleiding<br />

De keuze om allerlei attributes te specificeren, de keuze om hier een course of metadata corrections<br />

<strong>voor</strong> bij te houden: dat is typisch het terrein van de kamergeleerde, het plezier om dit soort dingen<br />

te bedenken en te maken. Ik heb nu niets te maken met mensen die zeggen: “maar dat komt toch<br />

nooit <strong>voor</strong> in de praktijk dat dat fout gaat, je moet praktisch blijven”. (Terwijl we geen van beide<br />

eigenlijk beschikken over goed vastgelegde metingen). Het geheel aan doelstellingen <strong>voor</strong><br />

<strong>Climbexion</strong> rechtvaardigt het gebruik van metadata courses of corrections. Wel verwacht ik een<br />

soort “self fulfilling prophecy”, als je attributes niet kunt wijzigen, dan bedenk je je wel twee keer<br />

<strong>voor</strong> je ze één keer invoert, als je ze kunt wijzigen dan zou je slordiger kunnen worden, en na een<br />

fout moet je ze dan wel wijzigen. Dan zeg je natuurlijk: “Goed dat het kan”.<br />

Zijn er alternatieven <strong>voor</strong> het verbeteren van attributes? Een event of een version met foute<br />

attributes kan worden opgevolgd door een event of version met correcte attributes. Een kin met een<br />

fout attribute kun je verlaten en verder gaan met een kin waarin het attribute wel goed is. Bij een<br />

fout element attribute zou je het element moeten beëindigen, om een nieuw element te beginnen met<br />

het correcte attribute. Hier<strong>voor</strong> zou de uitspraak: “een element vertegenwoordigd de kin in de<br />

drawer”, niet langer gelezen mogen worden als: “een element vertegenwoordigd als enige de kin”,<br />

maar meer als “op enig tijdstip is er hoogstens één element dat de kin vertegenwoordigd”. Alleen<br />

al omdat ik de eerste lezing omarm, en de tweede verwerp, moet het mogelijk zijn om fouten te<br />

verbeteren.<br />

In principe gaat het om uitspraken:<br />

● in een event is een stuk historie vastgelegd, maar er worden ook een aantal uitspraken<br />

vastgelegd over dat event.<br />

● In een repository worden een aantal kins vastgelegd, maar ook een aantal uitspraken over de<br />

kins.<br />

● In een drawer worden een aantal files vastgelegd, maar ook een aantal uitspraken over de<br />

files.<br />

● In een pool worden een aantal versions vastgelegd, met uitspraken over die version.<br />

Voor deze uitspraken geldt:<br />

● Elke mogelijke uitspraak zou moeten kunnen wijzigen in elke mogelijke andere liefst<br />

zinvolle uitspraak.<br />

● Een uitspraak vandaag over een historisch feit gisteren moet mogelijk zijn.<br />

2.3.2 Attributes, soorten en maten<br />

Over file karakteristieken kan het nodige gezegd worden. Op de IBM mainframes waarop ik ooit<br />

werkte had een file karakteristieken als bloklengte, recordlengte, recordformat, access methode,<br />

wijze van space allocation, om maar eens wat te noemen, om zo'n file te kunnen maken moeten al<br />

die karakteristieken worden opgegeven.<br />

Momenteel is er de Mime standaard, waarin file-types gekarakteriseerd zijn met 2 trefwoorden,<br />

bij<strong>voor</strong>beeld <strong>voor</strong> een adobe acrobat file: application/vnd.adobe.edn.<br />

Doorgaans herken je het file-type aan de extensie van de file. In de property sheet van de file<br />

explorer van mijn windows (98) systeem zit een tabblad met file extensies, mime-types en<br />

Pagina: 84 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

dergelijke. Bij een bepaald type hoort een programma om zo'n file te wijzigen, een viewer, en<br />

mogelijk nog meer software. In het <strong>revision</strong> <strong>control</strong> system is een dergelijke lijst ook nodig.<br />

● We willen bij<strong>voor</strong>beeld weten of er een merge programma bestaat <strong>voor</strong> een bepaald filetype,<br />

of een pretty print formatting programma.<br />

● De build folders die opgeslagen worden in het <strong>revision</strong> <strong>control</strong> system kunnen worden<br />

geplaatst in een archief-file (bij<strong>voor</strong>beeld een .zip file of een .tar.gz file) bij opslag, en de<br />

archief-file moet (meestal) worden uitgepakt als ze in een working-tree of info-tree wordt<br />

gedownload: dus build archief folder is van een ander type dan een file of een gewone<br />

folder.<br />

● De folders in de NHSW folder tree zijn in te delen in soorten, sommige zijn er <strong>voor</strong><br />

interfaces, anderen zijn een componenten set, weer anderen een enkele component<br />

enzo<strong>voor</strong>t. De architecten hebben entity types <strong>voor</strong> ze bedacht.<br />

● <strong>revision</strong> <strong>control</strong> programma's die een snapshot van een drawer zichtbaar maken kunnen een<br />

viewer aanroepen, als de inhoud van een version moet worden bekeken. Hier<strong>voor</strong> moet je<br />

het type weten.<br />

● Bij merging is er sprake van bases, neighbors en originals. Die moeten tot hetzelfde type<br />

behoren, en het type moet bediend worden door het merge programma.<br />

● Er zijn diverse conventies <strong>voor</strong> carriage/return characters in tekst files. De gebruikte<br />

conventie is een attribute van de version, Als wordt gedownload in een omgeving met een<br />

andere conventie, dan moet er automatisch worden geconverteerd.<br />

● In de documentatie van “Subversion” vond ik nog het volgende: een attribute om aan te<br />

geven of een file wel of niet “uitvoerbaar” is: dit is een Unix attribute.<br />

● Sommige typen file beginnen met een aanhef waarin <strong>Climbexion</strong> informatie moet plaatsen<br />

als datum, versie, naam van degene die de file gewijzigd of gemaakt heeft, en dergelijke.<br />

Andere file-types hebben hier<strong>voor</strong> een property sheet (extended metadata). En sommigen<br />

hebben helemaal niets. We moeten weten of een file een dergelijke aanhef kan hebben, of<br />

een dergelijke property sheet. Dit is dan al één extra attribute. Om informatie te plaatsen<br />

moeten er mogelijk additionele attributes worden bijgehouden. Dit feature van <strong>revision</strong><br />

<strong>control</strong> systems bestaat in ieder geval reeds sinds SCCS. Het is een klassieker.<br />

● Berucht in ons wereldje zijn endiaanse problemen met raw file formats, en ASCII<br />

/EBCDIC /Unicode conversies van teksten. Hopelijk zijn dergelijke conversies niet nodig,<br />

maar als ze nodig zijn, dan moet de betreffende codering samen met de file worden<br />

opgeslagen. Een <strong>revision</strong> <strong>control</strong> systeem heeft hier een bemiddelende rol tussen diverse<br />

omgevingen.<br />

● Software entiteiten (class, component, procedure en dergelijke) moeten overeenkomen met<br />

een file. Om aan te geven wat <strong>voor</strong> soort entiteit is opgeborgen in de file kun je een attribute<br />

gebruiken. Het file-type is dan bij<strong>voor</strong>beeld “C++ header file” en het entiteit type “abstract<br />

class”. Dit is van belang <strong>voor</strong> templates en pretty print programma's.<br />

● Typeringen kunnen van belang zijn om import limitations of export limitations te realiseren.<br />

2.3.3 Templates, wizards, pretty printing, macro's, en zo<br />

In enkele van de <strong>revision</strong> <strong>control</strong> systemen waarmee ik heb gewerkt gold: als je een nieuwe file<br />

introduceert, en (daarmee een nieuwe kin) dat zijn er twee mogelijkheden:<br />

● Je bied meteen een version aan.<br />

● Je registreert de nieuwe version in het <strong>revision</strong> <strong>control</strong> system die daarop een nieuwe<br />

Pagina: 85 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

maagdelijke working-tree file maakt met behulp van een template.<br />

Om een file aan de hand van een template te genereren is het meestal niet voldoende om een filetype<br />

te specificeren. Vaak moet de aard van de file moet ook gespecificeerd worden, bij<strong>voor</strong>beeld:<br />

dit Kword document is een interface beschrijving, of dit open-office document is een component<br />

beschrijving, of deze header file is een applicatie interface. De aard noemen we het “entity type”.<br />

Ik denk dat een template tool buiten <strong>Climbexion</strong> blijft. Het kan aan de hand van een model file of<br />

een model folder een initiële invulling maken. Enige wizard faciliteiten zorgen <strong>voor</strong> de juiste<br />

naamgeving van het element en mogelijk enige interne entiteiten. Het is de bedoeling om dit<br />

eenvoudig te houden, om aan de standaards van de architecten te voldoen. Wel zou zo'n tool<br />

optioneel de gegenereerde lege elementen moeten kunnen registreren in <strong>Climbexion</strong>, zodat hun kin<br />

gemaakt wordt. Anderzijds moeten ze ook zonder <strong>Climbexion</strong> kunnen werken, zodat ze behulpzaam<br />

kunnen zijn bij het overnemen van oude oplossingen in nieuwe structuren.<br />

Dezelfde gegevens kunnen in sommige gevallen gebruikt worden om tijdens “commit” een version<br />

in een working-tree door een pretty print programma te leiden dat de version formatteert volgens<br />

een ideaal, <strong>voor</strong>dat die wordt vastgelegd volgens de standaards van de package owner. Versions die<br />

gedownload worden in een info-tree of working-tree kunnen wanneer dat gewenst wordt eveneens<br />

door een pretty print programma geleid worden, om te voldoen aan lokale standaards. Zoiets heb ik<br />

ooit meegemaakt geloof ik.<br />

Deze programma's horen ook niet bij <strong>Climbexion</strong>. Hun gebruik als filter kan <strong>voor</strong> <strong>Climbexion</strong><br />

hinderlijk zijn. Versions worden waarschijnlijk geïdentificeerd door een hash van hun inhoud. De<br />

version die aangeboden wordt aan een filter heeft een andere identificatie dan de version die het<br />

filter verlaat.<br />

Het file-type kan ook gebruikt worden door een version <strong>control</strong> system om vast te stellen dat de file<br />

macro's kan bevatten, die <strong>revision</strong> <strong>control</strong> data plaatsen in een comment paragraaf, of dat de file een<br />

property sheet (extended metadata) bevat die ingevuld moet worden met <strong>revision</strong> <strong>control</strong> data<br />

volgens een template. In een comment paragraaf worden de waarden ingevuld die de macro's<br />

genereren. De waarden kunnen het best worden ingevuld als de version in een working-tree of infotree<br />

geplaatst wordt. De waarden worden het best verwijderd tijdens commit of als de version<br />

betrokken is bij een merge. Hier<strong>voor</strong> geldt hetzelfde als pretty print: ze zijn hinderlijk omdat ze een<br />

moderne version identificatie hinderen. Advies: gebruik deze macro's niet in content.<br />

Voor de property sheet met extended metadata geldt mogelijk niet het probleem van de content<br />

hash. Speciale macro's specificeren welke repository data in de metadata van een working-tree, of<br />

info-tree file terechtkomt. Gebruik extended metadata in plaats van macro's in de code.<br />

Over het algemeen zullen de templates en de pretty print regels vastgelegd zijn per package. In<br />

configuratie files en template files die in het package zijn opgenomen. De hulpprogramma's zelf.<br />

kunnen eventueel staan in een tools folder van het package. Pretty print hoort eerder thuis in een<br />

build dan in een commit, samen met een eventuele static analyzer.<br />

De pretty print regels <strong>voor</strong> het plaatsen in info-tree en working-tree kunnen thuishoren in het toppackage,<br />

eventueel met bijbehorende tools.<br />

Andere begeleidende tools zijn merge programma's die gebruikt worden om parallel wijzigen en<br />

ontwikkelen mogelijk te maken, en misschien een static analyzer die een aanvulling is op een merge<br />

programma, om mogelijke fouten van een merge operatie te signaleren. Analyzers kunnen specifiek<br />

Pagina: 86 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

zijn <strong>voor</strong> file-types en/of entity types. Merge programma's moeten mogelijk in staat zijn om hun<br />

input versions rechtstreeks te lezen uit <strong>Climbexion</strong>. Hun output komt in de working-tree, en kan<br />

daar verder geanalyseerd en bewerkt worden, om daarna met commit in de repository opgenomen te<br />

worden.<br />

2.3.4 File-type<br />

Als je kijkt naar een filenaam, dan begint die met een pad: een reeks folder namen. Daarna komt de<br />

naam, en tenslotte de extensie. De extensie is rechtstreeks afleidbaar uit het file-type. Als je het filetype<br />

bijhoud, dan zou extensie geen onderdeel van de name horen te zijn, althans onder Windows.<br />

Er is best wel een probleem met een attribute als “file-type” Als het een attribute is van version en<br />

de waarde is fout, dan is er best kans dat je een heel traject aan versions in een course moet<br />

wijzigen. Dit duidt op een slechte normalisatie: “file-type” is een eigenschap van de file, met een<br />

course of development, en een course of metadata corrections. Er zou dus een development course<br />

item “File-type” moeten bestaan met een file-type attribute en een valid time attribute die<br />

corrigeerbaar zijn.<br />

Nu neem je een bestaande version en plaatst die in de tip van een file in een drawer, Deze file is<br />

bij<strong>voor</strong>beeld een Visio plaatje, en de nieuwe version, – ik noem maar iets –, is een Smartdraw<br />

plaatje, en is gekopieerd uit een file die een Smartdraw plaatje is. Als “file-type” een eigenschap is<br />

van de file, dan is hierna de version meertypig, in twee courses met ieder een eigen type. Dat kan<br />

natuurlijk niet, en deze mogelijkheid duidt op een slechte data structurering: “file-type” moet een<br />

eigenschap zijn van de version. Blijkbaar gelden beide regels.<br />

Voor de repository kies ik <strong>voor</strong> een implementatie die de combinatie van valid time en transaction<br />

time” vermijdt. Het overnemen van versions uit andere drawers moet probleemloos verlopen: een<br />

eigenschap als “file-type” wordt een directe eigenschap van de version, zodat de eigenschap gaat<br />

gelden <strong>voor</strong> de file als de version wordt geïntroduceerd. De course of development van de<br />

eigenschap in de file wordt – wanneer nodig –, met een algoritme bepaald. En er is het<br />

automatisme dat een nieuw gecreëerde version het huidige file-type erft van zijn <strong>voor</strong>ganger in de<br />

course, tenzij anders vermeld.<br />

Mogelijk komen er handige opdrachten die attributes in een reeks versions in een traject van de<br />

course wijzigen, mocht een verbetering van het type nodig zijn Ook geldt: als zo'n attribute van een<br />

version verbeterd is en daardoor is gaan afwijken van een opvolger, dan moet dit in de course van<br />

de file gemarkeerd worden, als je die bekijkt.<br />

Als het attribute verbeterd moet worden, en de version is wijd uitgezwermd over de drawers en<br />

heeft op veel plaatsen opvolgers, dan moet er heel wat uitgezocht worden om alle courses in beeld<br />

te krijgen, die verbeterd moeten worden. Dat verbeteren kan dan weer met de handige opdrachten,<br />

dat wel, maar ja dan zijn er weer nieuwe verbeterde versies die uitgezwermd kunnen zijn, in weer<br />

andere drawers. Voorkomen is stukken beter dan genezen, maar als er moet worden genezen, dan is<br />

het goed als er middelen <strong>voor</strong>handen zijn.<br />

De kans op onopzettelijke fouten is erg klein, omdat op de desktop de file extensie gebruikt wordt<br />

door allerlei software. De meeste fouten zullen waarschijnlijk aanloop fouten zijn, als een file<br />

geregistreerd wordt in <strong>Climbexion</strong> <strong>voor</strong>dat de eerste version gemaakt wordt op de laptop of<br />

desktop, waarna de version gegenereerd wordt met hulp van een sjabloon. Er is dan nog geen<br />

uitzaaiing. Het is zeker dat er opzettelijke fouten kunnen worden gemaakt. Dat wordt bij<strong>voor</strong>beeld<br />

Pagina: 87 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

gebruikt bij het testen van <strong>Climbexion</strong>. Dus is er een rechtvaardiging <strong>voor</strong> het corrigeerbaar zijn van<br />

filetype.<br />

Introductie van een nieuw file-type in een bestaande course is niet triviaal <strong>voor</strong> de gebruiker,<br />

“commit” moet immers een (work) file met een andere extensie dan de <strong>voor</strong>ganger koppelen aan<br />

een file. Het overnemen in een andere drawer is dan weer gemakkelijk, dan is er een kin match.<br />

Met de toekenning van het file-type attribute aan een version lijkt het bijna 100% mogelijk om de<br />

juiste typering te specificeren. Echter zonder al te goed je best doet, is het waarschijnlijk mogelijk<br />

om een version te maken die aan geen één type beantwoordt. Als ware informatie freak overweeg ik<br />

dan ook <strong>voor</strong> om naast het file-type “word document” het subtype “mislukt word document” te<br />

specificeren. Hier kun je problemen krijgen met het dualistisch karakter van file-type: zo'n subtype<br />

van een word document kan beter niet automatisch doorgegeven worden aan een opvolger.<br />

In het ene project kunnen tools gebruikt worden waarin een version goed functioneert, terwijl in<br />

een ander project dezelfde version een tool laat crashen. Het specificeren van de juiste subtypes<br />

<strong>voor</strong> files is daarom een kunst op zich zelf.<br />

Voorbeeld:<br />

File subtypes van “Microsoft word” zijn bij<strong>voor</strong>beeld:<br />

● “Microsoft word 95”<br />

● “Microsoft word 97”<br />

● “Microsoft word 6.0”<br />

● “Microsoft word Failure”<br />

Oorspronkelijk hadden we slechts “Microsoft word”, en closed world subtypes “Correct en<br />

Failure” maar op een gegeven moment raakten we in de problemen.<br />

In project A wordt de extensie “doc” gegenereerd <strong>voor</strong>:<br />

● geen subtype attribute<br />

● “Microsoft word 95”<br />

en de extensie “undoc” <strong>voor</strong>:<br />

● “Microsoft word 97”<br />

● “Microsoft word 6.0”<br />

● “Microsoft word Failure”<br />

In project B wordt de extensie “doc” gegenereerd <strong>voor</strong>:<br />

● geen subtype attribute<br />

● “Microsoft word 95”<br />

● “Microsoft word 97”<br />

● “Microsoft word 6.0”<br />

en de extensie “undoc” <strong>voor</strong>:<br />

● “Microsoft word Failure”<br />

Normaal zal iemand, normaal zal <strong>Climbexion</strong>, proberen te <strong>voor</strong>komen dat failures of niet<br />

verwerkbare versions worden doorgegeven van het ene drawer naar het andere, maar zolang het<br />

subtype attribute niet correct is bijgewerkt kan de falende version verspreid worden.<br />

Er is nog de mogelijkheid dat het ene (sub) project werkt met andere tools dan het andere.<br />

Pagina: 88 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

Bij<strong>voor</strong>beeld: het ene project gebruikt MS Word, het andere gebruikt Framemaker, het ene gebruikt<br />

Visio, het andere Igrafx Flowcharter. Er moet een mogelijkheid komen om een version te weigeren<br />

als het file-type niet wordt ondersteund.<br />

Versions komen in een pool. Als er <strong>voor</strong> een version slechts één pool is dan is er geen probleem.<br />

Helaas zullen er lokale pools zijn, en komt een enkele version op meerdere plaatsen <strong>voor</strong>. Het<br />

doorvoeren van file-type correcties zal dan geen eenvoudige zaak zijn. De correctie moet<br />

doorgevoerd worden in alle locaties waarin de versie zich bevindt. Als we aannemen dat de locaties<br />

waarin een package <strong>voor</strong>komt een tree vormen, dan is er een automatisch push mechanisme dat het<br />

gewijzigde attribute naar de top duwt. En een pull algoritme waarmee locaties zich up-to-date<br />

houden. Dat laatste vereist enige discipline.<br />

Programmeer taal<br />

Als je een pascal programma een modula programma noemt, dan is dat een bewering die fout is, het<br />

is niet de werkelijkheid die geldt <strong>voor</strong> het programma waarop deze bewering slaat. In principe moet<br />

je dit kunnen verbeteren. Aangezien je een zo volledig mogelijke log wilt hebben van alles dat zich<br />

afspeelt in de repository, gelden <strong>voor</strong> dit soort wijzigingen transaction times. Programmeer taal<br />

attributes kunnen een course of corrections hebben.<br />

Om te beginnen zullen we eens kijken of het een attribute van de kin kan zijn.<br />

Een correctie die je vandaag maakt, geldt <strong>voor</strong> alle versions van de kin, ook die van gisteren. Een<br />

conversie van een programma naar een andere taal betekent een nieuwe kin.<br />

Dit zouden we kunnen verantwoorden, omdat we verwachten dat een overgang naar een andere taal<br />

ook het einde van Koala (als additioneel tool?) betekent. Een groot deel van de architectuur zou<br />

meteen mee veranderen, waardoor een “mixed language” overgang die begint met een één op één<br />

file conversie onwaarschijnlijk is.<br />

Maar een dergelijke toekenning van dit attribute aan een kin is geen garantie dat de versions<br />

werkelijk tot de geregistreerde programmeertaal behoren. Het is een “SOLL” <strong>voor</strong>schrift en niet een<br />

“IST” eigenschap. Eén enkele version in een verkeerde taal, en één in de goede, is een niet te<br />

repareren inconsistency als het een “ist” eigenschap betreft. Toch zijn er consequenties, want met<br />

behulp van de programmeertaal kan <strong>Climbexion</strong> de file extensie in een full path name genereren.<br />

Het is dan zeker niet een vrijblijvend <strong>voor</strong>schrift, en een verbetering kan sommige bestaande<br />

versions onbruikbaar maken.<br />

Als “programmeertaal” een attribute wordt van de kin, dan is het natuurlijk onzin om “mislukt<br />

fortran” op te nemen als mogelijke subattribute waarde, ook al is er misschien een version die een<br />

“denial of service” teweeg brengt tijdens het compileren. Ook verfijningen, zoals compiler version,<br />

zijn niet zinvol <strong>voor</strong> kins.<br />

Tot zover de kin studie.<br />

“Programmeer taal”, is een subset van “file-type”. We hoeven ze natuurlijk niet speciaal te<br />

behandelen. Mijn <strong>voor</strong>keur gaat ernaar uit, om het file-type attribute toe te kennen aan versions, en<br />

“programmeer taal” niet speciaal te behandelen, zeker na deze overwegingen.<br />

Subtypes <strong>voor</strong> programma's kunnen worden gebruikt om hun afhankelijkheid aan te geven van<br />

target systems, zoals MIPS, ARM, TriMedia. Ook zijn er smaken als 8 bits, 16 bit, 32 bit, 64 bit<br />

processors, of endiaanse beperkingen, die <strong>voor</strong> sommige programma's gelden. Daarnaast zijn er de<br />

Pagina: 89 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

diverse compiler/linker systemen. Veel programma's zullen portable zijn, maar mogelijk is het<br />

zinvol om <strong>voor</strong> sommige versions aan te geven dat ze gebonden zijn aan een omgeving zodat<br />

gewaarschuwd kan worden als ze worden hergebruikt.<br />

Geldt <strong>voor</strong> programma's dat portabiliteit wel of niet bereikt wordt, <strong>voor</strong> andere files gelden regels<br />

van al dan niet bereikte compatibiliteit. Dit is niet hetzelfde. Programma's zijn individueel te<br />

beoordelen op portabiliteit. In een vakkundige omgeving worden er regels opgesteld <strong>voor</strong> taal<br />

features die je wel of niet moet gebruiken om deze portabiliteit te waarborgen. Er zijn tools die<br />

statische analyses uitvoeren op programma's om de portabiliteit te waarborgen. Gewone files, die<br />

geen programma zijn, en die gemaakt zijn door een bepaalde generatie van een tool, zijn meestal<br />

als groep te beoordelen op compatibiliteit met een andere generatie van het tool. Voor het ene filetype<br />

kunnen er dus andere regels en algoritmes gelden <strong>voor</strong> subtyping, dan <strong>voor</strong> het andere.<br />

Koala ontwikkeling<br />

Toen we begonnen maakten we van een Koala Component een plaatje: een rechthoek met op de<br />

rand de ingaande en uitgaande interfaces, en erbinnen grafische symbolen <strong>voor</strong> modules, switches<br />

en componenten. Die inwendige componenten hebben ook ingaande en uitgaande interfaces.<br />

Interfaces zijn binnen de rechthoek verbonden met elkaar, met modules en met switches.<br />

Koala Component<br />

Dit plaatje komt uit de Koala<br />

documentatie.<br />

Eerst maakten we ze volledig met de hand met Microsoft Visio, later<br />

kwam er een tool dat ze genereert. Het tool genereert een nogal lege<br />

xml file uit een cd file, als die er nog niet is. Het plaatje dat zo<br />

ontstaat ziet er niet uit. Pas als met de hand de symbolen en lijnen op<br />

hun plaats zijn gezet is er een redelijk ogend schema. Ook kunnen<br />

lijnen worden <strong>voor</strong>zien van hoeken, zodat we van een druk schema<br />

een printplaatachtig schema kunnen maken. Deze gewijzigde en<br />

nieuwe posities worden geregistreerd in de xml file.<br />

Het tool om de plaatjes te maken en te bekijken gebruikt de koala cd<br />

file en de gelijknamige xml file, die in dezelfde folder staat. Het<br />

vereist enige goede wil om de xml versies te zien als de opvolgers van<br />

van visio versies, immers de functionaliteit van het visio plaatje wordt<br />

niet bereikt met de xml file maar met de combinatie van een cd file en<br />

een xml file. Ook is er enige goede wil nodig, omdat het visio plaatje<br />

zuiver “self-focused” is, terwijl de xml file enigszins “other-focused”<br />

lijkt.<br />

Als je de situatie nader bekijkt dan zie je dat de xml file een referentie<br />

bevat naar de cd-file, dus de cd file wordt door het tool ingelijfd in de xml file om het plaatje te<br />

genereren, zoals een header file wordt ingelijfd in een C file om een object file te maken. Het blijkt<br />

dus toch een self-focused source file te zijn. Dus kunnen we besluiten om de ”MS visio" versies<br />

van de file op te volgen met “koala graphic” versies.<br />

2.3.5 Entity type<br />

Het entity type geeft de aard van een file of folder weer. Bij<strong>voor</strong>beeld: de file is een “component<br />

beschrijving”, of een “abstract datatype”, of een “test resultaat”. Of bij<strong>voor</strong>beeld: de folder is een<br />

component, de folder bevat public interfaces, of unit-tests.<br />

Pagina: 90 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

Het is niet goed <strong>voor</strong>stelbaar dat je één kin hebt waarvan sommige files of versions een component<br />

beschrijving zijn en anderen een test resultaat. Soms is het misschien dubieus of je een file op een<br />

bepaalde manier mag <strong>voor</strong>tzetten of dat je een nieuwe file en daarmee een nieuwe kin moet<br />

beginnen. Maar als er één attribute in aanmerking komt om een eigenschap van een kin te zijn dan<br />

is het wel het entity type. Versions met een verschillende aard horen niet in dezelfde file of in<br />

dezelfde kin. Het is wel een typisch “soll” attribute, gewoon omdat het een intentie is van de kin en<br />

van degene die de kin maakte die niet automatisch geldt <strong>voor</strong> elke version. Je kunt daarin fouten<br />

maken. In ieder geval kan ik deze fouten opzettelijk maken, dus mogelijk kan het ook per ongeluk<br />

gebeuren.<br />

Correctie is nuttig als je per ongeluk een verkeerde entity type waarde hebt geselecteerd of getypt<br />

bij het aanmaken van de kin, maar is niet mogelijk na commit van een version met een verkeerde<br />

aard (misschien moet je bij een version in een attribute aangeven dat het item een vergissing was).<br />

Moet je een course bijhouden van de corrections? Ach, waarom niet, nu we in zijn algemeenheid<br />

hiervan gebruik maken.<br />

Een toepassing van “entity type” is ongetwijfeld het gebruik in import limitations. Een andere<br />

belangrijke toepassing is de mogelijkheid om templates te bieden. Templates zijn niet slechts van<br />

belang <strong>voor</strong> files, maar zeker ook <strong>voor</strong> folders. Hun type bepaald vaak al welke files en subfolders<br />

erin moeten of mogen <strong>voor</strong>komen. Koala is een programma dat tijdens build begrenzingen vast<br />

stelt, <strong>voor</strong> dependency lists, en van de sources die nodig zijn om een executable, te maken. Hierbij<br />

wordt gebruik gemaakt van het entity type van folders, om packages, component folders, interface<br />

folders, tools folders, test harness folders, scoop folders, en dergelijke te herkennen. Momenteel<br />

wordt daar<strong>voor</strong> de naamgeving en structuur van folders gebruikt, en natuurlijk de files die erin<br />

staan. Legacy en verschillen tussen teams kunnen een belasting gaan vormen die mogelijk met<br />

entity metadata is te <strong>voor</strong>komen.<br />

Ik denk dat er een probleem kan zijn met entity type. De levensduur van een package, en daarmee<br />

de levensduur van een kin is veel groter dan die van een project. Dat betekent minstens dat de<br />

codering van een entity type kan veranderen. Al was het alleen maar omdat een uniforme codering<br />

binnen een master project gewenst kan zijn. En anders zijn er wel internationale standaards, of tools<br />

die een bepaalde codering eisen.<br />

Mogelijkheden:<br />

● Meerdere coderingen van het entity type moeten mogelijk zijn, om steeds te voldoen aan een<br />

modern coderingssysteem. Het lijkt erop dat een entiteit attribute moet gaan bestaan uit het<br />

paar (code van de standaard, code van de entiteit). Een project kiest een standaard.<br />

● Bij een package wordt een codering bijgehouden, die aan geen andere standaard voldoet dan<br />

die van het package. Een stelsel entiteit codes kan alleen maar uitbreiden, maar niet<br />

wijzigen. Binnen een project wordt een vertaling gemaakt ten behoeve van tools, zodat de<br />

metadata in de working-tree voldoet aan de project eisen. Maar de metadata in de kins<br />

voldoet aan de package standaards.<br />

Heeft de kin alleen maar “soll” eigenschappen? De eigenschap dat een kin gebonden is aan een<br />

package is een “ist” eigenschap. Elements en versions behoren onvervreemdbaar tot het package<br />

omdat hun kin ertoe behoort. Het gegeven dat de kin aangemaakt is door Joost is een “ist”<br />

eigenschap die niet geldt <strong>voor</strong> al zijn elements en versions.<br />

Pagina: 91 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

“Soll” en “ist” zijn begrippen uit de administratieve organisatie en diens interne <strong>control</strong>e, waar<br />

een actuele werkelijkheid (“ist”) wordt vergeleken met een norm (“soll”). In het boek “Information<br />

modeling and Relational Databases” van Terry Halpin en Tony Morgan vond ik de begrippen<br />

“deontic” en “alethic” (niet helemaal) in plaats van “soll” en “ist” <strong>voor</strong> het typeren van<br />

“business rules”. Bij<strong>voor</strong>beeld: juridische wetten zijn deontic, en natuurkunde wetten zijn alethic.<br />

In feite heb je alleen bij een deontic rule een norm (soll) en een werkelijkheid (ist) die ermee<br />

vergeleken kan worden; bij een alethic rule is er uitsluitend een eigenschap van de werkelijkheid, in<br />

dat geval interesseert de interne <strong>control</strong>e niet <strong>voor</strong> “ist”, want er hoeft niet ge<strong>control</strong>eerd te<br />

worden of aan een norm is voldaan. Nog even in Wikipedia gekeken. Modale logica: redeneren met<br />

de modaliteiten “possible” en “necessary” en “contingent” is alethic logic, en redeneren met de<br />

modaliteiten “obliged” en “forbidden”, “permitted” is deontic logic. De begrippen “SOL” en<br />

“IST”, die ik gebruikte zijn dus niet terecht. Beter is het om ze deontic en alethic attributes te<br />

noemen.<br />

2.3.6 Restricties op kins<br />

Bij een kin zouden lijstjes van toegestane folders of toegestane names kunnen worden bijgehouden,<br />

met het doel de package varianten in de diverse subprojects onderling vergelijkbaar te houden, niet<br />

slechts <strong>voor</strong> <strong>Climbexion</strong>, die met kins kan werken, maar ook <strong>voor</strong> stervelingen die met names en<br />

folder names werken. Om name en folder wijziging te realiseren is er overleg en overeenstemming<br />

nodig tussen de teams die een package beheren. In principe heeft men hier geen speciale<br />

<strong>voor</strong>zieningen <strong>voor</strong> nodig. Afspraken zouden voldoende moeten zijn. Mocht je er toch toe besluiten<br />

om op deze wijze enig conservatisme te willen afdwingen, dan zou je kunnen overwegen om een<br />

kin door stadia te loodsen. In het “born” stadium, als de kin net is gerealiseerd kunnen name en<br />

folder reference vrij wijzigen. Later als de kin wordt aanvaard door de community, treedt het<br />

“registered” stadium in, en gaan de lijstjes gelden, en kunnen normale gebruikers slechts wijzigen<br />

<strong>voor</strong> zover de lijstjes dit toestaan. De lijstjes zelf worden bijgehouden door een autoriteit. In plaats<br />

van lijstjes zouden eventueel “regular expressions” kunnen worden gebruikt. Dergelijke lijstjes zijn<br />

typisch metadata. Het eigenaardige van dergelijke restricties is dat ze niet gelden <strong>voor</strong> de bestaande<br />

course items in de elements, maar uitsluitend <strong>voor</strong> nieuwe name en folder wijzigingen.<br />

2.3.7 Classifications ten behoeve van export limitations<br />

Classifications <strong>voor</strong> de geheimen van NXP zouden aan kins kunnen worden toegekend, maar<br />

misschien is er enige flexibiliteit nodig en zouden uiteindelijke definities kunnen worden<br />

vastgesteld in de subprojects, en dan gelden <strong>voor</strong> de elements in de drawers. De openheid of<br />

geslotenheid in het ene project kan afwijken van die in een ander project, en een wijziging in het<br />

beleid is niet automatisch van toepassing op alle bestaande subprojects. Ook bij gemeenschappelijk<br />

beleid is er flexibiliteit, als de uitvoering in het éne project kan verschillen van de uitvoering in een<br />

ander project.<br />

De scoop van een classificatie system is dan ook het subproject. Binnen een subproject worden<br />

classifications toegekend, die uiteindelijk resulteren in export limitations. Voor zover classifications<br />

Pagina: 92 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

worden toegekend aan versions, of elements betekent dit dat de betreffende attributes het subproject<br />

niet verlaten, maar dat ze de uitgangen van het subproject bewaken. Een subproject waarin een<br />

package geïmporteerd wordt mag die in principe niet doorgeven aan derden. Dus een geïmporteerd<br />

package is in zijn geheel strikt geheim.<br />

Het is te verwachten dat classifications simpel zijn, twee of drie, hooguit 4 classificatie niveaus is<br />

waarschijnlijk alles dat nodig is. Bij<strong>voor</strong>beeld: er zijn “ingewijden” die alles mogen zien, versus<br />

“buitenstaanders” die maar een beetje mogen zien. Binnen NXP zou de kaste van “audio/video<br />

bewerkers” meer ingewijd kunnen zijn dan de kaste der “driver makers”, die weer meer mogen zien<br />

dan “klanten”. Ingewijden zouden bij<strong>voor</strong>beeld “geheime” en “openbare” files mogen zien, en<br />

buitenstaanders alleen “openbare”. Er zijn dus classifications die betrekking hebben op geheimen<br />

van NXP die de distributie binnen het masterproject beperken. De beperkingen hoeven niet <strong>voor</strong><br />

alle teams hetzelfde te zijn<br />

Verder is er mogelijk een set files, waarvan je niet wilt dat die opduiken in een sister-project, omdat<br />

dit het vertrouwen van een partner beschaamt. Een geheim van een partner is geïmplementeerd in<br />

de software van NXP. Dit betekent een een tweede classification codering. De classification kan de<br />

export naar sister projects en reference design project aan banden leggen. Niet elk sister project zal<br />

dezelfde beperkingen hebben, bij<strong>voor</strong>beeld sister projects <strong>voor</strong> dezelfde klant kunnen het geheim<br />

vrij uitwisselen.<br />

Deze classification kan bovendien de distributie binnen een masterproject beperken, waardoor niet<br />

alle teams alle files krijgen.<br />

Classifications moeten op orde zijn als een baseline wordt samengesteld, maar ook, als een<br />

specifieke info-tree (uit een expose-drawer) worden samengesteld ten behoeve van debugging door<br />

een ander team, of misschien <strong>voor</strong> een demo. Ook als wijzigingen doorgegeven worden met behulp<br />

van external envelopes moeten de classifications blijven gelden. Het gebruik van envelopes van<br />

wijzigingen in een sister project zijn ook onderhevig aan de classification toets.<br />

Voor classificaties geldt dat het beleid (de classifications) ten aanzien van geheimen handmatig<br />

moet worden vastgelegd in of bij de repository. Dit kan bij<strong>voor</strong>beeld in de team-drawer <strong>voor</strong> files,<br />

en package references, want dit is de bron, vanwaaruit de andere drawers worden gevuld. Primair<br />

gelden de attributes daar <strong>voor</strong> de elements: files en package references.<br />

Voor het propageren van classifications naar andere drawers, geldt dat dit het beste kan met version<br />

attributes. Dus classification attributes moeten ook (automatisch) aangebracht worden als attributes<br />

van de versions, zodat ze gemakkelijk gepropageerd kunnen worden naar andere drawers.<br />

Versions met een classification moeten deze (automatisch) propageren naar nieuwe versions die<br />

eruit ontstaan.<br />

Tenslotte geldt dat geclassificeerde versions en package references niet mogen worden gekopieerd<br />

naar omgevingen (pools, drawers, working-trees, viewtrees) die lager geclassificeerd zijn. Een en<br />

ander kan betekenen dat allerlei tools en file systems onder <strong>control</strong>e staan van security<br />

mechanismen. Mogelijk is die situatie niet bereikt in de eerste releases van <strong>Climbexion</strong>.<br />

Van een package met classifications wordt normaal gedurende de looptijd van het project een<br />

library met binary object code of een executable met binary code beschikbaar gesteld aan<br />

buitenstaanders. Alle source code is gecompileerd om de binary code te maken. Ergens binnen de<br />

binaries, die zelf openbaar zijn, zitten –, hopelijk onwaarneembaar –, de geheimen. Daarnaast<br />

Pagina: 93 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

worden sources ten behoeve van de application interface beschikbaar gesteld, en gebruikersdocumentatie.<br />

Van de sources van de binary code en van hun ontwerp en implementatie<br />

documentatie wordt mogelijk een deel beschikbaar gesteld ten behoeve van debugging en analyse,<br />

<strong>voor</strong> zover dit geen geheimen onthult. Deze werkwijze is een praktische rand<strong>voor</strong>waarde. Stel de<br />

binary ontbreekt, en een source file wordt op zeker tijdstip (maar wel <strong>voor</strong> de looptijd van de file)<br />

geheim verklaard, dan moet er terstond een binary van de file gemaakt worden <strong>voor</strong> alle snapshots<br />

waarin die ontbreekt. Dit is additioneel fragmentarisch werk, dat erbij komt als classifications<br />

wijzigen. Dit geldt <strong>voor</strong> classifications binnen het masterproject, <strong>voor</strong> classifications <strong>voor</strong> sister<br />

projects geldt dit niet, want een package <strong>voor</strong> een sister project wordt niet letterlijk overgenomen,<br />

en de benodigde binaries worden binnen het sister project zelf gemaakt.<br />

Handmatig classification attributes toekennen aan files: Een wijziging van een classification<br />

betekent een wijziging <strong>voor</strong> alle versions in de course of development van de file. Zo'n wijziging<br />

kan een correctie zijn van een onjuiste classificatie, maar <strong>voor</strong>al ook een beleidswijziging. Er is dus<br />

sprake van een veranderde werkelijkheid. Maar, het is geen intentie van de repository om iets te<br />

registreren over een beleid, het is de intentie om iets vast te leggen over een file. Onder normale<br />

omstandigheden participeren classification event items niet in een (valid time) snapshot, maar wordt<br />

altijd de tip van de (transaction time) course van classifications gebruikt, ook op oude snapshots van<br />

files. Het attribute heeft dus een valid time gelijk aan de levensduur van de file waarop hij<br />

betrekking heeft, en een transaction time die ongeveer overeenkomt met een bepaald beleid, ten<br />

aanzien van geheimen.<br />

Pagina: 94 / 230<br />

classification update in een package op een welgekozen snapshot<br />

Weliswaar is het snapshot gekozen, maar de attributes die bijgewerkt worden zijn attributes van<br />

het element.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

Handmatige classifications toekennen aan folders en files. Een package snapshot wordt gebruikt om<br />

classifications toe te kennen. Top-down worden classifications toegekend aan folders, met<br />

toenemende geheimhouding. In feite worden de classifications toegekend aan de inner-reach van de<br />

folders. Enerzijds heeft men zo een systematische werkwijze, anderzijds, nu folders een<br />

classification attribute hebben, kunnen files die nieuw gecreëerd worden, het attribute erven van de<br />

folder waarin ze ontstaan. Misschien wordt deze exercitie enkele malen herhaald gedurende de<br />

looptijd van een project, want in nieuwe snapshots kunnen nieuwe files en folders staan. Mogelijk<br />

wordt dan meer fragmentarisch gewijzigd, top-down vanaf subtoppen.<br />

Gedurende de looptijd van een subproject kunnen files verplaatst worden van de ene naar de andere<br />

folder. Dus niet in elk snapshot zal gelden dat een file minstens zo geclassificeerd is als de folder<br />

waarin hij staat. Een export query selecteert de versions die niet te geheim zijn, en de folders die<br />

dan niet leeg zijn, dus de query maakt geen gebruik van folder classifications.<br />

Merk op dat er 2 rollen zijn van het attribute “classification”. Een classification die toegekend wordt<br />

aan een file of een package reference geldt <strong>voor</strong> het element: het element wordt wel of niet<br />

beschikbaar gesteld. Het attribute toegekend aan een folder heeft een heel andere rol: het wordt bij<br />

sommige gebeurtenissen gebruikt om de waarde door te geven aan een file of package reference in<br />

zijn inner-reach maar geldt niet <strong>voor</strong> de folder.<br />

(In plaats van classification levels, zou mogelijk ook gewerkt kunnen worden met permission<br />

levels, en dus afnemende geheimhouding naarmate je lager in de tree komt. De hele tree inhoud is<br />

dan alleen <strong>voor</strong> ingewijden, en sommige delen zijn ook <strong>voor</strong> buitenstaanders.)<br />

Waarom zo ingewikkeld? Ik hoop dat de top-down methode systematisch is. Ook hoop ik dat de<br />

methode navolgbaar is, zodat review en kritiek mogelijk zijn.<br />

Is dit nu alles? Nee, want niet alleen beleid kan veranderen, maar ook de software. Een module<br />

zonder geheimen kan wijzigen in een module met geheimen, als een verbeterd algoritme wordt<br />

geïmplementeerd. Het resultaat kan zijn dat het onmogelijkheid wordt om elk snapshot te beveiligen<br />

met dezelfde classifications. Een toekenning van classifications is dan adequate <strong>voor</strong> het ene<br />

snapshot maar is te restrictief of te ruimhartig <strong>voor</strong> een ander, en er is geen bevredigende<br />

gemeenschappelijke toekenning.<br />

De onderstaande studie is bedoeld om tot een beheersbare methode te komen die gebruik maakt van<br />

een course of development van classifications, zoals die er zijn <strong>voor</strong> versions, names, en folder<br />

references.<br />

Zodra een element door wijziging geheim wordt, of openbaar, wordt er vlak <strong>voor</strong> het course<br />

item dat de nieuwe version in de course plaatst een course item opgenomen dat een anchor is<br />

waarin <strong>voor</strong> de toekomst van de course het classification attribute wordt bijgehouden. Dit<br />

anchor kan een course of corrections ondergaan waardoor hij verplaatst wordt in de course<br />

of development van het element, hij kan geïntroduceerd worden of vervallen. Het anchor<br />

refereert aan een security change die herkend wordt door titels als: “de introductie van een<br />

privaat 3d-comb filter algoritme”, of “de overgang naar een openbaar stroomlijn algoritme”.<br />

Een reversed list toont per security change de betreffende anchors in de elements, zodat er<br />

een <strong>control</strong>e is op juistheid, volledigheid en ontwikkeling. Het anchor noemen we een<br />

classification-anchor en de security change noemen we een classification-set. De set is de<br />

verzameling elements waarin de nieuwe anchors staan.<br />

Pagina: 95 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

Als een nieuw element gemaakt wordt, dat wordt er ook een classification-anchor gemaakt.<br />

Dit kan een anchor zijn met of zonder referentie naar een classification-set. Alle latere<br />

classification-anchors hebben altijd een referentie naar een set. Het invoeren van een<br />

classification-set moet tijdig gebeuren, vóór of samen met de changeset die een geheim<br />

introduceert, tenminste als het er om gaat een geheim te introduceren, om een openbaarheid<br />

te introduceren kun je beter te laat zijn dan te vroeg.<br />

Het lijkt erop dat classification-sets op snapshots en tags lijken, wat betreft de inclusie van<br />

changesets. Maar snapshots en tags “kijken” terug in de tijd naar de meest recente event<br />

items van courses, terwijl classification-sets <strong>voor</strong>uit kijken, “van nu af aan gelden de nieuwe<br />

classifications”. Dus de timestamp van de classification-set wordt virtueel afgerond zodat<br />

die ouder is dan de <strong>revision</strong> waarop hij duidt, maar jonger dan de vorige <strong>revision</strong>. Het ziet<br />

ernaar uit dat classifications_sets worden bijgehouden buiten de changesets.<br />

Ik zal kort 2 scenario's beschrijven. In het ene houdt een expert alle classifications bij, en in het<br />

andere houdt het team de classifications bij, maar zorgt een expert <strong>voor</strong> een basis en correcties.<br />

Expert<br />

De expert is volledig en als enige verantwoordelijk <strong>voor</strong> het toekennen van classifications.<br />

Een expert voert de top-down exercities uit, en creëert classification-sets. Als een teamlid<br />

een file of folder verplaatst (door de folder reference te wijzigen), dan behoudt die de<br />

classifications die toegekend zijn door de expert.<br />

Team and Expert<br />

Ieder in een team is verantwoordelijk <strong>voor</strong> het uitvoeren van het beleid ten aanzien van<br />

geheimen. Bij de start van een subproject worden de betreffende packages <strong>voor</strong>zien van<br />

extra folder paren waarvan de naamgeving aangeeft welke classification er geldt. Ze heten<br />

bij<strong>voor</strong>beeld “secret” en “disclosed”. Een element start zijn leven in de inner-reach van zo'n<br />

Pagina: 96 / 230<br />

classification-set, classification anchor


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

folder. Mocht er een foute classification geconstateerd worden dan wordt wordt de file<br />

verplaatst naar de inner-reach van de andere folder, met de transaction optie: “classification<br />

correction”, waardoor de classification van het element wordt bijgewerkt in het bestaande<br />

classification-anchor . Als een file of (groepje files) verplaatst wordt met de optie:<br />

“classification development”, dan wordt een nieuwe classification-set gecreëerd, en <strong>voor</strong> de<br />

betrokken elements classification-tags. De file en folder structuur van een package in de tip<br />

van de drawer bepaalt de classifications van de files in de meest recente classification-set.<br />

Daarnaast is er nog een expert nodig <strong>voor</strong> review en correctie van classifications in<br />

classification-tags, <strong>voor</strong> het tussenvoegen, verplaatsen en laten vervallen van classificationtags<br />

in elements, het doorvoeren van beleids-wijzigingen en dergelijke.<br />

Naast het vastleggen van het beleid is er nog het propageren van classifications. Als een version<br />

wijzigt ontstaat een nieuwe version, met de classification van het origineel. Als een version ontstaat<br />

uit twee andere versions, dan is de nieuwe classification (automatisch) minstens zo restrictief als de<br />

classifications van de twee. Dit moet gerealiseerd worden <strong>voor</strong> wijzigingen in satellites en workingtrees.<br />

Het liefst zo dat het propageren van de classification onontkoombaar is. De automatische<br />

propagatie gaat uit van een worst-case aanname, die mogelijk nog gecorrigeerd moet worden. Als<br />

nieuwe versions de team-drawer binnenkomen, dan moet hun classification in overeenstemming<br />

zijn met die van de file, anders moet er (handmatig) een conflict opgelost worden.<br />

Zie:Dorothy E. Denning: “A Lattice Model of Secure Information Flow”. Communications of the<br />

ACM May 1976, Volume 19 number 5.<br />

Het kopiëren naar export-drawers en expose-drawers gebeurt volledig op version en package<br />

reference classifications. Mochten er daarna nog classification corrections komen dan geldt:<br />

“jammer dan”. Hoogstens kan daarna nog een snapshot aangemaakt worden, dat qua classifications<br />

correct is.<br />

In de folder tree van NHSW komen de folders “public” en “private” <strong>voor</strong> met een andere betekenis<br />

dan de folders “secret” en “disclosed” die ik hier introduceerde. “Public”: de components en<br />

interfaces in de inner-reach mogen worden gebruikt in andere packages, “Private”: de<br />

components en interfaces in de inner-reach mogen niet worden gebruikt in andere packages. Het<br />

betreft hier information hiding ten behoeve van maintainability, en reliability. De informatie<br />

(component en interface descriptions) in “private” folders is verborgen <strong>voor</strong> software in andere<br />

packages, maar niet <strong>voor</strong> mensen in andere subprojects.<br />

2.3.8 Original en neighbor<br />

Stel je gebruikt een envelope uit een ander project om een wijziging door te voeren, dan krijg je min<br />

of meer automatisch de attributes “original” en “neighbor” ingevuld bij het de element reference in<br />

de eigen envelope (zie <strong>voor</strong> deze begrippen: 2.4.1). Als er bij<strong>voor</strong>beeld 5 files in de envelope staan<br />

dan kunnen de attributes in 5 maal ingevuld zijn. Nu kun je <strong>voor</strong> sommige programma's besluiten<br />

om niet merge samen te voegen, maar om een andere oplossing te programmeren. Dan kan het zijn<br />

dat je de attributes wilt uitgummen. Ook als je wel merge gebruikt maar naderhand ook nog wijzigt,<br />

dan wordt het mogelijk dubieus of de attributes nog wel gelden. Aan de andere kant is het misschien<br />

wel zo dat je deze attributes wilt opgeven, terwijl je er geen merge tool <strong>voor</strong> hebt gebruikt. Kortom,<br />

Pagina: 97 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

je moet ze kunnen verbeteren.<br />

Het is wel zeer verleidelijk om wijzigen toe te staan zonder transaction times bij te houden, immers<br />

dit speelt zich <strong>voor</strong>namelijk af als de envelope ontwikkeld wordt in een satellite, die heeft immers<br />

een typisch een werkplaats karakter. Toch schakel je dan bij <strong>voor</strong>baat een stukje logging uit.<br />

Bovendien kan het natuurlijk ook <strong>voor</strong>komen, dat iemand zijn wijzigingen overdraagt, en twee<br />

nachten later opeens wakker schrikt, overeind zit in zijn bed en weet: “original en neighbor zijn fout<br />

ingevuld”. Dus net als wijzigingen van de attributes van andere entiteiten hoort er een transaction<br />

time bij.<br />

Nu is het zo dat één van mijn uitgangspunten is dat een persoon of een groep zijn eigen proces<br />

vastlegt en vervolgens zijn product presenteert aan anderen Het volledig vastleggen van de<br />

ontwikkeling van de envelope in een satellite is typisch informatie over het proces. Deze informatie<br />

moet samengevat worden tot product informatie bij een overdracht, dus alleen het uiteindelijke<br />

resultaat wordt overgedragen, en niet de ontwikkeling tot het uiteindelijke resultaat.<br />

Een envelope is toch iets dat als één geheel pendelt tussen satellites en center-drawer en eventueel<br />

een transfer drawer. Dus toch maar geen transaction times <strong>voor</strong> attributes. Voorlopig geef ik dus toe<br />

aan de verleiding.<br />

2.3.9 Base en labored<br />

In envelopes kent men een reeks die bestaat uit “base” event items, die een basis leggen <strong>voor</strong><br />

wijzigingen, en “labored” event items die de <strong>voor</strong>gaande base opvolgen. In principe geldt hier<strong>voor</strong><br />

wat gold <strong>voor</strong> “original & neighbor”. We zullen <strong>voor</strong>lopig geen transaction times bijhouden, maar<br />

de labored version overschrijven.<br />

2.3.10 Kin references<br />

Een file verwijst naar een kin. Het kan <strong>voor</strong>komen dat iemand een nieuwe file, en dus een nieuwe<br />

kin begint, en later blijkt dat dat er al een kin bestaat <strong>voor</strong> de file. Dan moet je de reference van de<br />

file naar de kin kunnen verbeteren. Ook, als een kin reeds bestaat, en een file is erop gebaseerd, en<br />

later blijkt dat de file verwijst naar de verkeerde kin, dan zou je de verwijzing moeten kunnen<br />

verbeteren.<br />

Dergelijke fouten kunnen zijn uitgezwermd over veel drawers, het verbeteren is dan geen fluitje van<br />

een cent.<br />

Misschien heeft het zin een kin naar een ander te laten verwijzen als blijkt dat ze hetzelfde zijn.<br />

Deze verwijzing zou dan bij gelegenheid, (bij<strong>voor</strong>beeld als onderdeel van een synchronisatie)<br />

kunnen resulteren in een update van het file attribute. Actieve drawers die een synchronisatie<br />

ondergaan komen dan vanzelf aan bod <strong>voor</strong> een update.<br />

2.3.11 Attributes van drawer, package, pool, machine<br />

Drawer<br />

Een drawer speelt een rol in een constellation. Rollen zijn: “center”, “transfer”, “satellite”. Zowel<br />

rol als constellation zijn attributes. In wezen is constellation de referentie naar centrale pool waarin<br />

Pagina: 98 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.3 Metadata<br />

envelopes bewaard worden. Een constellation heeft dus een URL. In satellites kan er behoefte zijn<br />

aan een private pool, waarin een envelope verkeert totdat er een bepaalde kwaliteit bereikt is, en<br />

mogelijk dient de lokale pool ook om een kopie te kunnen gebruiken, als je niet op je werkplek<br />

bent, en afgesloten van het intranet. De referentie naar de lokale pool is ook een attribute.<br />

Moet je deze rol en deze referenties kunnen wijzigen? In principe wel, maar de samenhang moet<br />

gerealiseerd zijn als je met de constellation werkt (om deze attributes te wijzigen wordt de drawer<br />

als het ware even “uit de lucht” genomen, soms moet dit mogelijk <strong>voor</strong> de hele constellation). Moet<br />

je de historie bewaren? Liefst wel, maar bij historische gegevens kan de samenhang waarschijnlijk<br />

niet gelden, als bij<strong>voor</strong>beeld een envelope pool, of een center-drawer wordt verplaatst dan wijst een<br />

vorige URL nergens naar.<br />

De constellation pool waarin envelopes bewaard worden wordt genoemd in meerdere drawers, en<br />

hetzelfde kan gelden bij lokale envelope pools. Als de envelope pool verplaatst wordt dan moet dit<br />

bij alle drawers worden aangepast.<br />

Heeft een drawer een kin? Voorlopig zie ik daar geen directe toepassing <strong>voor</strong>.<br />

Attributes van een package<br />

Er zijn de references naar lokale pools <strong>voor</strong> versions, kins, other-focused files en dergelijke. Deze<br />

referenties moeten zo worden bijgehouden dat de samenhang gehandhaafd blijft. Al deze references<br />

zijn URL's.<br />

Attributes van pools<br />

Vaak refereren ze naar een centrale pool, die nuttig is bij de distributie van wijzigingen.<br />

2.3.12 Tenslotte<br />

Uiteraard hoort bij een transaction, of het nu een update van een attribute betreft of de update van<br />

een element, de naam of user-id van degene die de wijziging uitvoert. Dit is een belangrijke reden<br />

om courses of metadata corrections bij te houden <strong>voor</strong> attributes: de wie,wat, waar, wanneer reden.<br />

Waarschijnlijk moet er een zekere eenheid bestaan binnen een masterproject. Voor attributes als<br />

“file-type”, “entity type” en dergelijke, kunnen het best standaards worden gespecificeerd zowel<br />

wat betreft de waarden, als ook de toekenning van het attribute aan een climbexion entiteit. Teveel<br />

verschillen tussen packages leiden waarschijnlijk tot meer werk bij het opstarten van een project.<br />

Als je erover nadenkt dan valt het op dat er eigenlijk niets triviaal is aan de attributes die je wilt<br />

opnemen bij kins, files, event items, en versions, enzo<strong>voor</strong>t. Ze zijn moeilijk op één hoop te gooien,<br />

qua wijze van bijhouden, wijze van doorgeven, en wijze van gebruik.<br />

Pagina: 99 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

2.4 Werkwijzen<br />

2.4.1 Merging<br />

Basics<br />

Er zijn meestal twee programma's betrokken bij merging, een difference program en een merge<br />

program. Het merge program gebruikt de resultaten van het difference program. Tegenwoordig is er<br />

ook vaak een interactief (GUI-based) programma, waarmee naast merging ook editing mogelijk is.<br />

Er zijn drie versions van een kin betrokken bij een merge. Een original O en twee nieuwe varianten<br />

N1 en N2. De wijzigingen om van O een N1 te maken kunnen worden bepaald met het difference<br />

program. We noemen deze wijzigingen diff(N1,O) Ook diff(N2,O) wordt bepaald. Het merge<br />

program moet nu de combinatie diff(N1,O) en diff(N2,O) aanbrengen op O. Dit mag echter alleen<br />

als er geen conflicterende overlap is tussen beide.<br />

Stel 2 files worden met elkaar vergeleken met een difference program en ze komen <strong>voor</strong> 95%<br />

overeen. Aan het 3-way merge programma geven we een null file op als original van deze 2 files.<br />

Pagina: 100 / 230<br />

Simpele interactieve merge<br />

Conflict tijdens merge


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

Dan hebben we 100% overlap en dus potentieel 100% conflict. We gaan dan additionele analyses<br />

uitvoeren op de twee files om een refinement van de conflicts te vinden.<br />

In het version <strong>control</strong> programma dat we gebruikten ging merging al mis door de aanhef van de<br />

source files. Ze begonnen met conflicten.<br />

/*<br />

* Copyright(C) 2002 Koninklijke Philips Electronics N.V.,<br />

* All Rights Reserved.<br />

* This source code and any compilation or derivative thereof is the<br />

* proprietary information of Koninklijke Philips Electronics N.V.<br />

* and is confidential in nature.<br />

* Under no circumstances is this software to be exposed to or placed<br />

* under an Open Source License of any type without the expressed<br />

* written permission of Koninklijke Philips Electronics N.V.<br />

*<br />

*############################################################<br />

*/<br />

/*!<br />

* \file avpppy_mpow.c<br />

*<br />

* \brief -<br />

*<br />

*/<br />

/*----------------------------------------------------------*<br />

*<br />

* %version: 4 %<br />

* %date_created: Sat Aug 26 17:48:26 2006 %<br />

* %date_modified: Mon Sep 17 14:26:31 2007 %<br />

* %derived_by: memphis %<br />

*<br />

*<br />

*############################################################<br />

*/<br />

Conflicts zie je in "version", "date_modified", "derived by" als je een merge uitvoert. De default<br />

oplossing van het merge programma: twee regels "version", twee regels "date_modified", en twee<br />

regels "derived by", dus je moest wel ingrijpen. De opensource adepten zullen wel zeggen: "Dat<br />

komt er nou van"<br />

Stel bij<strong>voor</strong>beeld dat er een original version is, die in twee files (iedere file in zijn eigen drawer)<br />

<strong>voor</strong>komt en dat in de course van beide files exact dezelfde wijziging is aangebracht, dan behoort<br />

de wijziging tot de overlap. Nu zou de overlap wel eens volledig conflict-vrij kunnen blijken te zijn<br />

bij additionele analyses.<br />

We veronderstellen dat een (original) file bestaat uit een reeks atomen (bij<strong>voor</strong>beeld regels), en dat<br />

een difference analyse ontdekt welke atomen veranderd zijn, of verdwenen, of verplaatst, of dat er<br />

atomen zijn toegevoegd tussen 2 atomen van O. Het kan zijn dat diff(N1,O) en diff(N2,O) beiden<br />

een wijziging tonen op hetzelfde atoom in O, of dat beiden laten zien dat er tussen dezelfde 2<br />

atomen toevoegingen zijn geweest. Dergelijke wijzigingen noemen we de overlap.<br />

Bij een unattended merge mag één der files N1 of N2 dominant worden verklaart. Als N1 dominant<br />

Pagina: 101 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

is dan wordt N1 new bewaard. Het merge programma bepaalt de wijzigingen zonder overlap van N1<br />

en die van N2. Dan wordt N1 new gemaakt door de wijzigingen zonder overlap van N2 en alle<br />

wijzigingen van N1 aan te brengen op O. Ook N2 new, wordt gemaakt door de wijzigingen zonder<br />

overlap van N1 en alle wijzigingen van N2 aan te brengen op O. Dan bepaalt diff(N1 new,N2 new) de<br />

conflicten, en de gewijzigde dominante file wordt behouden.<br />

Een veel preciezere beschrijving van een drieweg merge en conflicts vond ik in Wikipedia:<br />

“A Formal Investigation of Diff3” van Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.<br />

Een theorie <strong>voor</strong> wijzigingen en het overnemen ervan vond ik in het Darcs manual:<br />

http://darcs.net/manual/ het hoofdstuk: "Theory of patches"<br />

Mijn beschrijving is misschien leuk <strong>voor</strong> het begrip, maar echte merge en diff programma's hebben<br />

meestal een veel sneller algoritme dan ik hier beschrijf, en bovendien soms ontzettend veel opties,<br />

onder meer om defaults aan te nemen bij conflicts.<br />

Vaak wordt een merge interactief uitgevoerd door een ontwikkelaar met een programma dat 2 files<br />

vergelijkt: N1 en N2. De ontwikkelaar wijzigt één van de twee files door er wijzigingen van de<br />

ander in aan te brengen. Het programma kent niet de original file, maar de ontwikkelaar wel. Die<br />

moet weten wanneer er een conflict is, en welke wijzigingen moeten worden overgenomen.<br />

Niet <strong>voor</strong> alle files zijn er difference program, maar <strong>voor</strong> tekst files zijn ze wel te koop. Ook als er<br />

wel een difference program is, is er niet <strong>voor</strong> alle typen files een merge program, en soms slechts<br />

een al dan niet interactive 2-way merge.<br />

Waarschuwing<br />

Niet altijd is merging toereikend. Daarom is het goed om te overleggen, als parallel-wijzigingen<br />

verenigd moeten worden. In het <strong>voor</strong>beeld “Merge is onvoldoende” zouden Lagus en Cunie<br />

Pagina: 102 / 230<br />

Interactieve 2-way merge<br />

Cunie weet dat ze Jos niet verwijderd heeft, dus ze zal alleen Lenie toevoegen, Klaas<br />

wijzigen en Rein verwijderen uit de versie van Lagus


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

kunnen afspreken dat Lagus zijn aanpassing uitbreidt als hij het laatste zijn envelope overdraagt<br />

maar dat Cunie het doet als zij het laatste is. In het <strong>voor</strong>beeld zijn de wijzigingen geconcentreerd in<br />

een tabel in een file. Maar je kunt ook langs elkaar heen werken in verschillende files, of in<br />

verschillende delen van één enkele file, dan is het merge programma helemaal ontoereikend, om<br />

een conflict te herkennen. Een klein testje toonde aan dat ook mijn c compiler hier geen warning<br />

gaf. Dus mogelijk zou zo'n onvolkomenheid zeer laat en moeizaam ontdekt kunnen worden.<br />

Voorbeelden die mis kunnen gaan:<br />

● de classes C1, C2, C3 erven van class C. Cunie breidt C uit met een functie, en <strong>control</strong>eert in<br />

C1, C2 en C3 of deze functie moet worden overschreven, en in C3 is dat inderdaad het<br />

geval. Ondertussen maakt Lagus de class C4 die ook erft van C. In C4 is de <strong>control</strong>e van<br />

Cunie achterwege gebleven. Stel nu dat veel later ontdekt wordt dat de functie in C4 ook<br />

overschreven had moeten worden, dan moeten de registraties in de repository kunnen tonen<br />

dat de oorzaak van de fout hoogst waarschijnlijk een parallel update is. Als je erop<br />

doorzoekt vindt je misschien de class C5 van Lepus, die in diezelfde tijd is gemaakt. Als je<br />

dan C5 en C4 naast elkaar legt dan blijkt bij<strong>voor</strong>beeld, dat het assignment “C5 object = C4<br />

object “ niet triviaal is maar expliciet moet worden geprogrammeerd. Lagus en Lepus<br />

hadden slechts C1, C2, C3 hierop ge<strong>control</strong>eerd.<br />

Als je wijzigt op één plaats in de source code, dan <strong>control</strong>eer je misschien wel tien plaatsen<br />

op neveneffecten, maar het kan je ontgaan dat er een elfde plaats ontstaat, of dat één van de<br />

tien gewijzigd wordt.<br />

● Cunie lost probleem P1 op en Lagus P2. Beide problemen vereisen dezelfde wijziging in<br />

functie F. Bij<strong>voor</strong>beeld: er moet een teller T verhoogd worden. Cunie plaatst aan het begin<br />

van de functie het statement T= T+1, en Lagus plaatst aan het eind van de functie het<br />

statement T = 1 + T (of misschien wel T++). Na merge zijn beide statements<br />

geïmplementeerd en wordt de teller onbedoeld twee maal verhoogd.<br />

● Cunie implementeert het raadplegen van een variabele of de aanroep van een procedure die<br />

door Lagus verwijderd wordt.<br />

● In het Darcs manual hoofdstuk “Theory of changes” worden wijzigingen integraal op de<br />

folder-tree beschouwd en wordt aandacht besteed aan replacements zoals naamswijzigingen<br />

van bij<strong>voor</strong>beeld variabelen of procedures. Met het simpele merge programma op versions,<br />

Pagina: 103 / 230<br />

Merge is onvoldoende


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

soms gecombineerd met een commander-achtig programma <strong>voor</strong> de wijzigingen op de<br />

folder-tree ben je soms (of misschien wel vaak) niet rigoureus genoeg. Bij<strong>voor</strong>beeld: de één<br />

verplaatst een procedure van file1 naar file2, terwijl de ander er een wijziging in aanbrengt.<br />

"Darcs" (http://darcs.net/)<br />

Conclusie: merge is slechts goed, <strong>voor</strong> een deel van de problemen met parallel updates. Maar <strong>voor</strong><br />

versie één van <strong>Climbexion</strong> zullen we het er maar mee doen.<br />

Incidenten met parallel oplossen zal ik in de rest van het verhaal een “Lagus & Cunie” noemen.<br />

Waarom Lagus en Cunie? Ik heb mij laten vertellen dat die een doorsnee gehuwd stel<br />

representeren.<br />

Merge in <strong>Climbexion</strong><br />

In <strong>Climbexion</strong> wordt een merge programma gebruikt op versions van dezelfde kin, die behoren tot<br />

hetzelfde file-type.<br />

Als we een merge uitvoeren om in de eigen team-drawer wijzigingen over te nemen van een file uit<br />

een andere drawer, bij<strong>voor</strong>beeld alle wijzigingen vanaf snapshot A tot en met snapshot B in de<br />

andere drawer, dan noemen we:<br />

1. de version van het snapshot A: original<br />

2. de tip uit de eigen drawer: base<br />

3. de version uit snapshot B: neighbor.<br />

De wijzigingen die nodig zouden zijn om van de original version de base version te maken zijn de<br />

te behouden wijzigingen, ofwel de “keep”. De wijzigingen om van de original version de neighbor<br />

te maken noemen we de “update”.<br />

Wanneer een envelope implemented is, en daarna wordt besloten om de wijziging niet door te laten<br />

gaan, dan zijn er <strong>voor</strong> een betrokken file twee mogelijkheden:<br />

● de labored version uit de envelope is nog steeds een tip: dan maken we zijn directe<br />

<strong>voor</strong>ganger tot “labored” in de undo envelope, en de tip wordt “base”.<br />

● De version heeft opvolgers: Nu nemen we de version zelf als original, zijn <strong>voor</strong>ganger (de<br />

base version uit de envelope) wordt de neighbor, en de tip van de file wordt de base. De<br />

wijzigingen op original om zijn <strong>voor</strong>ganger te maken zijn de “update”, de wijzigingen op<br />

original om de tip te maken zijn de te behouden wijzigingen, de “keep”.<br />

Als we gisteren programma versie V2 hebben gemaakt in onze satellite, gebaseerd op V1, en we<br />

zien vandaag een nieuwe tip V3 in De team-drawer, waarop we de wijzigingen willen baseren, dan<br />

is <strong>voor</strong> de overgang op de nieuwe basis:<br />

● V1 de original<br />

● V3 de base<br />

● V2 de neighbor<br />

<strong>voor</strong> de uit te voeren merge.<br />

Het belang van een merge tool is <strong>voor</strong>al dat wijzigingen gemaakt in omgeving A overgenomen<br />

kunnen worden in omgeving B. Deze overnames willen we graag zo routinematig mogelijk<br />

uitvoeren, het liefst zo dat het tool dit autonoom doet, zonder interactie.<br />

Pagina: 104 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

Tenslotte<br />

● We hebben gezien dat het file-type kan wijzigen in de course van een file. Dan kun je geen<br />

merge gebruiken om wijzigingen in een versie met type FT1 over te nemen in een versie met<br />

type FT2. Dat wil natuurlijk niet zeggen, dat zo'n wijziging onmogelijk kan worden<br />

overgenomen, maar het kan niet routinematig, laat staan unattended. Zou je in plaats<br />

daarvan niet een andere file, dus een andere kin moeten gaan gebruiken? Waarschijnlijk is<br />

daar wel wat <strong>voor</strong> te zeggen, maar ik denk dat ik die beslissing aan de gebruiker laat, en niet<br />

aan <strong>Climbexion</strong>, of zijn bedenker.<br />

● Veel document editors bieden faciliteiten <strong>voor</strong> het opslaan van meerdere versies, in één<br />

document, om versies te integreren (merge) in een resultaat versie, om progressie te tonen<br />

met een difference analyse en dergelijke. De integratie van deze faciliteiten met <strong>Climbexion</strong><br />

zal zeker niet onmiddellijk plaatsvinden, en misschien wel nooit. Eigenlijk zou je het liefst<br />

een versie van zo'n tool hebben zonder ingebouwde merge, maar met een drieweg merge<br />

tool meegeleverd. Dit weer typisch een <strong>voor</strong>beeld van een <strong>revision</strong> <strong>control</strong> systeem dat<br />

eisen stelt aan een tool dat <strong>voor</strong> development wordt gebruikt.<br />

● Voor veel documenten, maar ook <strong>voor</strong> spreadsheets, en vector en object gebaseerde plaatjes<br />

(diagrammen), is er een syntaxis gedefinieerd zodat er ook een gewone tekst opslag<br />

mogelijk is (bij<strong>voor</strong>beeld TeX, XML, RTF, comma separated files). In principe zou een<br />

normaal merge programma hierop losgelaten mogen worden. Een <strong>voor</strong>waarde is<br />

waarschijnlijk dat degene die de merge uitvoert de tekst file zou moeten kunnen lezen en<br />

verbeteren, bij<strong>voor</strong>beeld om conflicten op te lossen. Een merge zou gevolgd kunnen worden<br />

door uitvoering van een static analyzer: een check programma op syntaxis en<br />

onwaarschijnlijke constructie, die het conflicten lijstje, indien nodig, uitbreidt.<br />

Software-ontwikkel-teams met een werkwijze die afhankelijk is van merge zouden hun<br />

ontwikkel tools zo moeten kiezen dat de source files die gemaakt worden kunnen worden<br />

verenigd met merge. Ze kunnen verbeterd worden met een tekst editor in een IDE, liefst<br />

natuurlijk zo dat ze het effect van de wijziging meteen WYSIWYG kunnen bekijken in een<br />

window met het document, de spreadsheet, of het diagram. Je hebt niet alleen de juiste tools<br />

nodig maar ook de juiste mensen die niet alleen maar wysiwyg kunnen werken. Dat eist wel<br />

enige opleiding denk ik. Integratie tot een binary kan plaatsvinden met behulp van een make<br />

tool en een compiler. Deze geïntegreerde files zijn er <strong>voor</strong> de lezers en gebruikers van de<br />

informatie. De makers van de informatie wijzigen bij<strong>voor</strong>beeld direct op de source files, of<br />

ze zien de tekst van de source files en het resultaat wysiwyg, en wijzigen op één van beide<br />

presentaties, en zien de wijziging ook in de andere. Al met al lijkt het een behoorlijke<br />

inspanning te kosten om te komen tot een repository <strong>voor</strong> alle source files, als ze allen<br />

parallelle ontwikkelingen moeten kunnen doormaken die later met een merge tool verenigd<br />

moeten worden. Voorlopig is er ook de oplossing dat software wordt toegewezen aan kleine<br />

groepjes personen, die parallel ontwikkelen vermijden, als het gaat om binaire source<br />

documenten <strong>voor</strong> analyse design en development.<br />

● Waarschijnlijk is de afhankelijkheid van een merge programma <strong>voor</strong> een repository een<br />

reden dat men terughoudend is met de introductie van case-tools, immers een adequaat 3weg<br />

merge tool ontbreekt meestal. Een andere reden kan zijn dat men terugdeinst <strong>voor</strong> de<br />

derived files die met case-tools gegenereerd worden, en die mogelijk ook hun plaats<br />

verdienen in de repository.<br />

Pagina: 105 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

2.4.2 Synchronisatie<br />

Soorten<br />

● De meest simpele soort synchronisatie maakt de tip van een drawer exact gelijk aan een<br />

snapshot van een ander. Ook een deel van een drawer, bij<strong>voor</strong>beeld een package kan exact<br />

gelijk worden gemaakt aan die van een ander. Dit noemen we exact copy. Exact copy wordt<br />

uitgevoerd op alle typen course-items. (Name, folder reference, version). Envelope<br />

references worden niet gekopieerd, want ze worden niet gerekend tot de course van een<br />

element, maar tot een attribute van het event dat de course uitbreidt. Alleen een wijziging<br />

breidt een course uit. De course van een ongewijzigd element blijft ongewijzigd. Import en<br />

export limitations zijn mogelijk, maar niet altijd noodzakelijk.<br />

● Dan is er synchronisatie die mogelijk periodiek plaatsvindt. Uit drawer A wordt gekopieerd<br />

naar B. Wijzigingen die in B zijn aangebracht (neighbor) sinds de vorige synchronisatie<br />

(original) mogen niet vervangen worden, maar moeten worden worden gemengd (merge)<br />

met overeenkomstige nieuw gewijzigde elements in A (base). Het resultaat (labored) komt<br />

in de working-tree, en kan met commit worden geplaatst op de tip. Als het overeenkomstige<br />

element niet in A gewijzigd is hoeft er uiteraard niet gekopieerd of gemengd te worden. Ook<br />

dit kan plaatsvinden over de hele drawer of over een deel ervan. Naar keuze kan merging<br />

wel of niet unattended (automatisch, zonder toezicht) plaatsvinden. Een unattended merge<br />

kan incidenten loggen, als er conflicten optreden, of als er files betrokken zijn waar<strong>voor</strong><br />

geen merge program bestaat. Als er conflicten of problemen opgelost moeten worden moet<br />

alsnog iemand met een editor de integratie van de wijziging verzorgen, of bij een naam of<br />

folder conflict beslissen welke naam of referentie gebruikt moet worden. Kopiëren met<br />

unattended merge noemen we merge copy. Zonder unattended merge synchroniseren<br />

betekent dat gewijzigde elements in B niet automatisch worden vervangen, als elements ook<br />

in A gewijzigd zijn. De merge moet handmatig (interactief) gebeuren. Deze methode<br />

noemen we careful copy. Een lijstje dat aangeeft welke elements een interactieve merge<br />

moeten ondergaan of waar een beslissing moet worden genomen over een naam conflict<br />

dient dan als “to do” lijstje. Vaak worden import limitations gebruikt om files die niet met<br />

merge zijn samen te stellen, uit te sluiten.<br />

<strong>Climbexion</strong> software moet het volgende garanderen bij deze copy methoden:<br />

Als een course item de tip niet wezenlijk wijzigt (version, name of folder reference blijven<br />

hetzelfde), dan vindt het event dat de course zou uitbreiden niet plaats. Er wordt geen event<br />

toegevoegd.<br />

Synchronisatie is een “pull”action: in de “eigen” drawer synchroniseer je elements met een andere<br />

drawer. Er wordt geen envelope gebruikt <strong>voor</strong> een dergelijke actie, maar als import of export<br />

drawers gesynchroniseerd worden met een nieuwe release dan dient de envelope als certificaat. De<br />

envelope is dan eigenlijk een externe representatie van de changeset, en garandeert dat de nieuwe<br />

release door de build manager in de drawer is geplaatst, want de envelope bevat zijn elektronische<br />

handtekening.<br />

Pagina: 106 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

2.4.3 Synchronisaties tussen satellite en working-tree<br />

Nieuwe elements<br />

In een working-tree kunnen files <strong>voor</strong>komen die niet in het <strong>revision</strong> <strong>control</strong> system zijn<br />

geregistreerd. Bij<strong>voor</strong>beeld build results <strong>voor</strong> unit tests, of test results, adhoc programmatuur, of<br />

nieuwe folders en programma's. In version <strong>control</strong> systems zorgt een configuratie file er<strong>voor</strong> dat<br />

nieuwe files in hun totaliteit, als groep, geregistreerd kunnen worden in de satellite: de configuratie<br />

file fungeert dan als poortwachter, die sommige files niet toelaat. We veronderstellen dat dergelijke<br />

configuratie files eenvoudig door één man in een team zijn te maken, en bij te houden. In wezen<br />

betreft dit import limitations op een satellite, <strong>voor</strong> nieuwe elements die overgedragen moeten<br />

worden vanuit de working-tree. Ook de entity types en file-types van de nieuwe files en folders<br />

moeten of worden herkend met behulp van de configuratie files, of alsnog met de hand worden<br />

toegekend.<br />

Een nieuwe file betekent:<br />

● Er wordt een kin <strong>voor</strong> vastgelegd in een pool.<br />

● Er wordt een element met course <strong>voor</strong> gemaakt in de satellite.<br />

● Een version wordt geplaatst in een pool.<br />

<strong>Climbexion</strong> werkt met privé satellites, dus is er mogelijk nauwelijks een argument te vinden om<br />

files in een working-tree niet ook op te slaan in de satellite: hun bestaan is immers een historisch<br />

feit, en je hoeft zo'n file immers niet per se over te dragen naar de center-drawer.<br />

De meeste files moeten worden worden geregistreerd als gewone file, maar sommigen zijn otherfocused<br />

files. In de configuratie file moet mogelijk ook aangegeven worden welke files in<br />

aanmerking komen om als other-focused file te worden geregistreerd.<br />

Behalve files kunnen ook nieuwe folders en packages <strong>voor</strong>komen in de working-tree. Nieuwe<br />

folders registreren, door ze te creëren in de working-tree en ze daarna met de registratie opdracht in<br />

de satellite en de pools te registreren is net zo simpel als files registreren. Gewone folders moeten<br />

wel zijn te onderscheiden van packages (via de configuratie files of door middel van manuele<br />

opgave of met behulp van van metadata).<br />

Een elders bestaand package moet kunnen worden geregistreerd als een reference, om daarna de<br />

satellite en de working-tree te synchroniseren vanuit een andere drawer.<br />

Een nieuw package registreren, en er de pools <strong>voor</strong> opzetten moet ook mogelijk zijn. De inhoud van<br />

het package moet daarna toch vanuit de working-tree zijn te registreren.<br />

Registreren vanuit de working-tree gebeurt in veel <strong>revision</strong> <strong>control</strong> systemen met een “add”<br />

opdracht. Deze opdracht kan parameterloos zijn, of hij kan een expressie bevatten die de registratie<br />

beperkt tot de elements die met de expressie geduid worden. Eventueel impliceert het registreren<br />

ook het overnemen van name, folder reference, version en dergelijke in de drawer, dus “add”<br />

impliceert “commit” .<br />

Een nieuw element maken <strong>voor</strong> working-tree en satellite samen.<br />

Dit is mijn favoriete methode. Een tool gebruikt een template om de folder, of de file te maken in de<br />

working-tree en registreert het element meteen in satellite en kin pool. Een configuratie file lijkt niet<br />

nodig. Een mogelijke variant: Het tool werkt onafhankelijk van <strong>Climbexion</strong>, de “add” opdracht<br />

Pagina: 107 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

wordt gebruikt <strong>voor</strong> opname in de drawer.<br />

Geregistreerde elements bijwerken vanuit de working-tree.<br />

Hier<strong>voor</strong> gebruikt men over het algemeen de “commit” opdracht. Naam en folder reference<br />

wijzigingen kunnen niet zonder meer met commit worden overgedragen, maar eisen speciale<br />

opdrachten. Ook het beëindigen van een course eist mogelijk specifieke opdrachten.<br />

Opmerking:<br />

Als het file system van de working-tree toestaat dat kin identifiers, element-types en dergelijke als<br />

metadata worden opgeslagen bij de elements, zou met één enkele opdracht de satellite kunnen<br />

worden bijgewerkt vanuit de working-tree.<br />

Voorbeelden:<br />

● bij nieuwe elements zou de top folder van een package herkend kunnen worden aan de<br />

metadata.<br />

● Bij bestaande elements zou beëindiging, verplaatsing, en naamsverandering kunnen worden<br />

herkend, want de kin identifier is bekend.<br />

● Een nieuwe version wordt herkend aan de version identifier, i.p.v. De “date last modified”.<br />

De working-tree bijwerken vanuit de satellite.<br />

Exact copy maakt de working-tree gelijk aan de tip van de satellite. In de configuratie file kan staan<br />

welke ongeregistreerde files en folders kunnen vervallen en welke je wilt behouden.<br />

Merge copy plaatst het resultaat van een merge in de working-tree. De merge vindt plaatst met<br />

original en neighbor in een drawer, en base in tip van de satellite. Er is “commit” nodig om de<br />

satellite up-to-date te maken. Eventueel kunnen merge conflicten interactief, of naderhand met een<br />

editor worden verholpen, <strong>voor</strong>dat “commit” wordt uitgevoerd.<br />

Pagina: 108 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

2.4.4 Het werken met team-drawer, transfer-drawer en satellite.<br />

Course Element E1 Envelope Element E1<br />

version Type Timestamp Seqnr version Type<br />

Wa Base T 1 Wa Base<br />

Wb Labored T+1 2 Wc Labored<br />

Wc Labored T+2<br />

Om met een schone lei te beginnen doen we een exact copy over de hele inhoud van de tip-tag van<br />

de center-drawer, naar de satellite. De tip van de satellite wordt met een tag tot “base” verklaart,<br />

want hij vormt de basis van nieuwe wijzigingen. Als de base de start van een nieuw probleem<br />

markeert is het zelfs een “problem base”. Dan wordt de working-tree gelijk gemaakt met de tip van<br />

de satellite: exact copy. We gaan nu wijzigingen aanbrengen in de working-tree, die we met<br />

“commit” vastleggen in de satellite.<br />

Als we wijzigingen willen behouden dan beginnen we met “commit” van alle betreffende files. Dan<br />

plegen we “exact copy” vanaf de tip-tag van het center. Deze copy wordt de nieuwe tip van de<br />

satellite, en <strong>voor</strong>zien van een “base” tag. Daarna vindt de merge plaats met de vorige base als<br />

original en de zojuist vervangen tip als neighbor. De nieuwe versies komen in de working-tree.<br />

“commit” plaatst ze terug in de satellite.<br />

Met de opdracht “commit” worden wijzigingen vanuit de working-tree overgedragen naar de<br />

satellite, maar vaak tegelijk ook ook naar een envelope. In een envelope komen “base” / “labored”<br />

paren van de elements die gewijzigd zijn. Het meest recente “labored” version vervangt een<br />

eventueel eerder geregistreerde version in de envelope. Voor de envelope geldt: alleen het resultaat<br />

telt, dus niet de historie. Met een expliciete opdracht kunnen een oude base, en het labored snapshot<br />

op die base verwijderd worden uit de envelope. Dit moet met een aparte opdracht worden gedaan,<br />

want, zoals later blijkt, het kan zin hebben om dezelfde wijziging te baseren op meer dan één base.<br />

Pagina: 109 / 230<br />

Synchronize, Edit, en Commit<br />

Course Element E1 Envelope Element E1<br />

version Type Timestamp Seqnr version Type<br />

Wa Base T 1 Wa Base<br />

Wb Labored T+1 2 Wc Labored<br />

Wc Labored T+2 3 Wd Base<br />

Wd Base T+3 4 We Labored 1 )<br />

We Labored 1 ) T+4<br />

Synchronize again, Merge, Commit<br />

1 ) In dit geval zullen we de satellite niet vervuilen met de triviale informatie dat Wa de original, en Wc de<br />

neighbor is van een merge die leidt tot We.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

De envelope variant<br />

Bij het implementeren van wijzigingen kan het <strong>voor</strong>komen dat iemand gebruik maakt van<br />

Pagina: 110 / 230<br />

Envelope gebaseerd op tip-tag van het center en tip van de transfer-drawer<br />

Geselecteerde implementation data


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

beschikbare of van adhoc instrumentatie. Eerst ter analyse, later om het effect van de wijziging te<br />

demonstreren. Hierbij kunnen working-tree files buiten de envelope gewijzigd zijn. Bij<strong>voor</strong>beeld<br />

om enige logging te activeren, wijzigt men een gedefinieerde constante in een programma.<br />

De variant begint als altijd met een exact copy van de tip-tag van de team-drawer. Afhankelijk van<br />

de duur van analyse, software wijzigingen en testen kan besloten worden om tussentijds met merge<br />

copy een nieuwe base te implementeren.<br />

Tenslotte volgt een fase waarin de uiteindelijke wijzigingen hun vorm krijgen. Als de envelope<br />

klaar is worden de component test en de overdrachts-test (een kleine regressie test) uitgevoerd. Dit<br />

is een test met menselijke waarneming en handmatige handelingen. In sommige projects wordt ook<br />

een statische analyse uitgevoerd met het QAC tool.<br />

In deze één na laatste laatste fase mogen er in files buiten de envelope geen verschillen meer zijn<br />

met de tip-tag van de team-drawer, want dat wordt vereist <strong>voor</strong> de component en regressie tests. Om<br />

dit te waarborgen kan gebruik worden gemaakt van een synchronisatie die zorgt dat alles buiten de<br />

envelope een exacte kopie wordt van de tip-tag van de team-drawer, en alles binnen de envelope<br />

met merging wordt gebaseerd op de tip-tag. Deze methode is de “envelope variant of careful or<br />

merge copy”. Careful copy is met name van belang als er in de elementen in de envelope gewijzigd<br />

is ten behoeve van ad hoc logging, want deze wijzigingen mogen niet overgedragen worden naar de<br />

team-drawer. Met een interactieve merge kun je deze wijzigingen teniet doen. Waarom de tip-tag<br />

van de team-drawer en niet de tip van de transfer drawer? Wel, <strong>voor</strong> de tip-tag geldt dat er een<br />

kwaliteit waarborg is afgegeven door de build manager. Dit maakt het iets waarschijnlijker dat test<br />

of build problemen veroorzaakt worden door eigen fouten.<br />

Als laatste fase kan synchronisatie worden herhaald met de verwachte tip (in plaats van de tip-tag<br />

van de team-drawer): dit is de tip in de transfer-drawer. Deze tip wordt een snapshot in de teamdrawer<br />

als alle envelopes, die zijn overgedragen sinds de tip-tag ontstond, worden overgedragen aan<br />

de team-drawer. Als <strong>voor</strong>gaande, reeds overgedragen envelopes (mogelijk van anderen) één of meer<br />

elements bevatten die ook in de eigen envelope <strong>voor</strong>komen, dan is er, door deze laatste merge copy,<br />

<strong>voor</strong> sommige elements een nieuwe base ontstaan, en een door merge verkregen nieuwe labored<br />

version. Deze worden in de envelope geplaatst (dus de versions die gebaseerd zijn op de center tiptag<br />

blijven ook in de envelope staan). De programmeur <strong>control</strong>eert of het compileren goed verloopt<br />

(en in sommige projects of QAC geen warnings geeft), en zo ja dan kan de envelope worden<br />

overgedragen. In deze laatste fase blijven de tests achterwege, maar er wordt wel een build<br />

uitgevoerd.<br />

Dit waren de regels in de meeste fasen in de meeste projects van NXP.<br />

Als de wijzigingen van een element gebaseerd zijn op versions die geen tip zijn in de transferdrawer<br />

of de team-drawer, dan wordt de envelope geweigerd als je hem wilt overdragen naar de<br />

betreffende drawer. Tenminste één van de paren base/labored van een element moet de juiste base<br />

hebben. Nadat een envelope met inhoud is overgedragen naar de transfer-drawer, vinden er ook van<br />

daar uit nog acceptatie tests plaats, <strong>voor</strong>dat de overdracht naar de center-drawer wordt gerealiseerd.<br />

Dit hoort een formaliteit te zijn, maar soms worden fouten geconstateerd. Dan is het zaak om een<br />

envelope als schuldige aan te wijzen (soms meerdere). Als de build manager besluit om de foute<br />

envelopes niet mee te nemen dan kan hij de tip-tag van de team-drawer gebruiken om opnieuw een<br />

basis te creëren in de transfer-drawer, en daarop de niet geweigerde envelopes opnieuw aan te<br />

brengen, eventueel met enige extra base / labored paren. Ook kan de build manager besluiten om de<br />

Pagina: 111 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

schuldige envelope tegen te boeken, met een “undo envelope” op de tip van de transfer-drawer.<br />

In de laatste fasen van een project wordt vaak de transfer-drawer overgeslagen. Envelopes worden<br />

dan na een aangepaste overdrachts-test onmiddellijk in de team-drawer geplaatst. Daarna wordt er<br />

een external envelope gemaakt, en verstuurd.<br />

Overdrachten worden gerekend tot de “push” methoden: vanuit de “eigen” drawer (de satellite)<br />

wordt gepusht in de andere drawer (de transfer-drawer).<br />

Normaal streeft men er naar om een wijziging binnen een dag te realiseren, soms lukt dit niet.<br />

Sommige wijzigingen zijn niet simpel te splitsen in hapklare brokken van één dag, soms heeft men<br />

pech met hardware, of komt er een hogere prioriteit wijziging tussendoor. Vaak echter kan iemand<br />

meerdere wijzigingen op één dag realiseren.<br />

Soms realiseer je meerdere envelopes en pleegt dan de vereiste overdracht tests en builds op het<br />

geheel.<br />

Routine werk met <strong>Climbexion</strong>:<br />

1. Full snapshot copy<br />

2. Difference snapshot copy: base for merge.<br />

3. Difference snapshot copy: base for envelope variant of merge.<br />

4. Difference snapshot copy: base for envelope variant of merge.<br />

5. Transfer copy: envelope content<br />

6. Transfer copy: envelope content<br />

opmerking:<br />

Een M /EM boog representeert original en neighbor, de pijlpunt representeert de base van de merge.<br />

Pagina: 112 / 230<br />

Routine werk met <strong>Climbexion</strong>


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

Enige kanttekeningen.<br />

● Door de architectuur van de layer waaraan ik werkte, waren er sommige files die zeer<br />

frequent gewijzigd werden. Deze files werden op één dag soms door meerdere mensen<br />

gewijzigd en zo ontstond de behoefte om meerdere alternatieve base / edit paren aan te<br />

bieden in een envelope. De geschetste werkwijze beperkt het aantal paren tot twee. Gegeven<br />

de eis om bepaalde builds uit te voeren <strong>voor</strong> elk snapshot waarop de wijzigingen zijn<br />

gebaseerd is het ondoenlijk om als derde of vierde in een rij van envelopes een alternatief<br />

maken <strong>voor</strong> elke mogelijke situatie die zich kan <strong>voor</strong>doen, als <strong>voor</strong>gaande envelopes worden<br />

geweigerd. (Zie ook 2.8.3)<br />

● Mijns inziens kan de overdracht van transfer-drawer naar team-drawer zo geautomatiseerd<br />

worden, dat ze meermalen per dag uitgevoerd kan worden. Er kunnen dan meerdere tags<br />

per dag gemaakt worden. Dit zou de kans op update op update van nog niet<br />

geïmplementeerde envelopes kunnen verminderen.<br />

● De deel van oplossing is misschien om te zorgen dat de individuele checks afdoende zijn,<br />

zodat transfers rechtstreeks kunnen worden aangebracht in de center-drawer, en ieder altijd<br />

de tip van de center-drawer gebruikt als base. De build manager zorgt éénmaal per dag –,<br />

of extra tussendoor na klachten –, <strong>voor</strong> builds en regressie tests. Als een fout gevonden<br />

wordt, dan wordt een nieuw probleem geregistreerd, of een oud probleem heropend. Als de<br />

situatie urgent is dan wordt de fout onmiddellijk opgelost, samen met de boosdoener wiens<br />

envelope de fout introduceerde. Dit kan eventueel door een “undo” van de betreffende<br />

envelope, maar liefst door de fout te herstellen. In deze situatie komen other-focused files<br />

zoals build results, en test results van de regressie tests goed tot hun recht. Er hoeft niets<br />

<strong>voor</strong> te worden geblokkeerd.<br />

● In een working-tree kunnen twee soorten wijzigingen <strong>voor</strong>komen: wijzigingen binnen een<br />

envelope, en wijzigingen erbuiten. Wijzigingen binnen een envelope moeten worden<br />

zichtbaar gemaakt, <strong>voor</strong> andere gebruikers van de center-drawer. Voor een envelope in het<br />

preparing stadium zou je een “commit” commando moeten gebruiken om hem zichtbaar te<br />

maken, zodra de wijziging zich aftekent.<br />

● Satellites maken het mogelijk om een gewijzigde version onmiddellijk vast te leggen in de<br />

satellite. Er zijn dan files die wel, en files die niet worden bijgehouden in een envelope. Er<br />

kunnen commits plaatsvinden van versions met adhoc logging, en tenslotte van versions<br />

zonder deze logging. Op deze manier is een satellite een persoonlijke log van van de eigen<br />

activiteiten.<br />

● Ideaal zou zijn als één persoon één satellite heeft. Maar het is waarschijnlijk efficiënter als<br />

een satelliet onlosmakelijk bij een center hoort. Werkt iemand <strong>voor</strong> twee centers dan zijn er<br />

in ieder geval twee satellites. Werkt iemand binnen een center-drawer aan twee<br />

onafhankelijke wijzigingen tegelijk, dan zijn er twee satellites nodig. Het meest<br />

overzichtelijk is waarschijnlijk het gebruik om per wijziging één satellite te maken.<br />

● Hoe één en ander in zijn werk gaat bij de moderne gedistribueerde version <strong>control</strong> systems:<br />

zie “DVCS Round-Up: One System to Rule Them All?” van Robert Fendt<br />

(http://ldn.linuxfoundation.org/article/dvcs-round-one-system-rule-them-all-part-1)<br />

● Op het internet vond ik vergelijkingen van <strong>revision</strong> <strong>control</strong> systems, waarin gemeld werd dat<br />

sommigen de wijzigingen opslaan die leiden tot een nieuwe version. De wijzigingen <strong>voor</strong><br />

adhoc logging hoeven niet te worden meegenomen in de envelope, maar de echte<br />

wijzigingen wel. Hier<strong>voor</strong> werd de term “interactive commit” gebruikt. In de eerste release<br />

van <strong>Climbexion</strong> wordt deze methode niet geïmplementeerd: de resulterende versions worden<br />

Pagina: 113 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

vermeld in de envelope, niet de delta ten opzichte van de base. Een systeem met dergelijke<br />

faciliteiten: “Darcs" (http://darcs.net/), "Fossil", (http://www.fossil-scm.org/). In plaats van<br />

“Interactive commit” is er in <strong>Climbexion</strong>: “careful copy” en die gaat aan de commit<br />

<strong>voor</strong>af.<br />

● We hebben te maken met een viertal tests. De eerste drie worden uitgevoerd door een<br />

programmeur. De programmeur is aanwezig op de werkplek en kan geluid en beeld<br />

<strong>control</strong>eren, de afstandsbediening gebruiken, een dvd in een speler stoppen, apparaten<br />

aansluiten of pluggen eruit trekken.<br />

Adhoc tests. Eerst laten ze zien wat het probleem is daarna dat de wijziging werkt.<br />

Component tests laten zien dat de gewijzigde components zich gedragen zoals verwacht.<br />

(sommige component tests hoeven trouwens niet te draaien op een TV, maar kunnen<br />

uitgevoerd worden op een PC)<br />

De transfer test, toont aan dat de layer nog steeds <strong>voor</strong> dagelijks gebruik geschikt is.<br />

De acceptatie test wordt uitgevoerd op een <strong>voor</strong>af geprepareerde werkplek zonder dat er<br />

iemand aanwezig is. Het is een uitgebreide regressie test, die door de build manager<br />

wordt gebruikt.<br />

De adhoc tests worden meestal uitgevoerd met behulp van de afstandsbediening of middels<br />

een interactieve sessie. Met uitzondering van de adhoc tests volgen de tests een script, dat in<br />

samenwerking met een tester is gemaakt. Component test scripts worden gemaakt door de<br />

programmeur, en daarna beoordeeld door een tester. De inhoud van transfer tests en de<br />

acceptatie test zijn volledig de verantwoordelijkheid van de testers.<br />

Omdat ze de verantwoordelijkheid waren van de testers, liepen de tests soms achter bij de<br />

software. Er werd dan ook wel eens op gemopperd. Dat was niet altijd terecht. Ik heb wel<br />

eens gemopperd op de test en daarna een showstopper overgedragen. Met de test was niets<br />

mis, maar met mijn wijziging in de software wel.<br />

● Er zijn nogal wat builds betrokken bij dit alles. Voor MIPS software is er een debug mode en<br />

een optimize mode mogelijk <strong>voor</strong> een build. Voor TriMedia software wordt gebruik gemaakt<br />

van een optimize mode, wel of niet met logging options, en een “assert mode “.<br />

Probleem reproductie: product en/of layer build in optimize mode of debug mode.<br />

Adhoc tests: product en/of layer build in debug mode.<br />

Component tests: build van een eigen test harness of misschien een layer build, in debug<br />

mode<br />

Transfer test: layer build, in debug mode<br />

Pre transfer build: product en/of layer build, in optimize mode<br />

Daily builds door build manager: product en layer builds in debug en optimize mode.<br />

● Tijdbesteding van een ontwikkelaar (in willekeurige volgorde):<br />

Synchroniseren en kopiëren (koffie drinken).<br />

Het <strong>voor</strong>bereiden van een test werkplek. (soms moet je zoeken naar spullen)<br />

Testen<br />

Soms moet je wachten tot een werkplek of een apparaat beschikbaar komt (koffie<br />

drinken).<br />

Builds (koffie drinken)<br />

Analyseren en programmeren<br />

Pagina: 114 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

2.4.5 Een geabonneerd package inlijven<br />

Geabonneerd package overnemen.<br />

Ongeveer worst case scenario, omdat er wijzigingen ontwikkeld worden, en er external envelopes<br />

ontstaan. Die hadden er eigenlijk al moeten zijn<br />

1. Copy exact: base<br />

2. Copy exact: differences of package only: source for envelope 5.<br />

3. External envelope applied to satellite, source for envelope 6.<br />

4. External envelope applied to satellite, source for envelope 7.<br />

5. Envelope originated from differences between 1 and 2.<br />

6. Envelope originated from external envelope 3.<br />

7. Envelope originated from external envelope 4.<br />

8. Envelope on own packages source for external envelope 10.<br />

9. Envelope for own packages source for external envelope 11.<br />

10. External envelope originated from envelope 8<br />

Pagina: 115 / 230<br />

Geabonneerd package overnemen.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

11. External envelope originated from envelope 9<br />

12. New base for envelopes 8 to11.<br />

13. Additional base for envelopes 8 to 11.<br />

14. Transfer as a whole<br />

15. Transfer as a whole<br />

16. External envelopes are finished in baseline constellation for final base / labored pairs<br />

Als een integrator een nieuwe baseline van een geabonneerd package implementeert dan wordt de<br />

baseline exact overgenomen. Eventuele patches raak je kwijt, eventuele nieuwe patches kunnen<br />

daarna worden aangebracht. Dit betekent:<br />

● De integrator synchroniseert zijn satellite met het center, om een base te maken.<br />

● De tip van de satellite, de primaire envelope, en de working-tree worden bijgewerkt door<br />

een query die een baseline van het package uit de import drawer kopieert.<br />

● Er vinden tests plaats, mogelijk worden baseline supplements aangebracht in de satellite en<br />

één op één gekopieerd in eigen envelopes. De eigen packages worden indien nodig<br />

gewijzigd, dat kan soms betekenen dat deze wijzigingen ook als baseline supplements<br />

worden uitgegeven. De aanpassingen van eigen packages komen in separate envelopes .<br />

Alle envelopes worden gerelateerd aan elkaar en aan de primaire envelope, en er wordt een<br />

onderlinge volgorde vastgesteld: de comrade volgorde. Deze volgorde realiseert de partiële<br />

ordening die ontstaat als de labored file version in de ene envelope een base version is in de<br />

andere.<br />

● De wijzigingen op de eigen packages moeten mogelijk tussentijds en tenslotte opnieuw<br />

worden gebaseerd op de tip-tag van het center, waarna de vereiste builds en tests<br />

plaatsvinden. Daarna worden ze nog eens gebaseerd op de tip van de transfer-drawer,<br />

waarna de vereiste builds plaatsvinden.<br />

● Het geheel wordt overgedragen.<br />

2.4.6 Het overnemen (adopt) van envelopes uit een sister-project<br />

Het principe is simpel: de eigen envelope bevat een referentie naar de over te nemen andere<br />

envelope. Voor elke file in de andere envelope geldt:<br />

● De base van de ander wordt het original in de eigen.<br />

● Labored in de ander wordt de neighbor in de eigen.<br />

Immers diff(base ander,labored ander) representeert de wijziging die is teweeg gebracht door de<br />

andere envelope en diff(base ander, base eigen) representeert datgene dat behouden moet worden.<br />

Soms zijn er alternatieve base/labored paren bij een file. Dan geldt over het algemeen het paar dat<br />

geïmplementeerd is in de center-drawer.<br />

In principe kun je net zo veel envelopes opnemen in de query van de eigen envelope als je wenst.<br />

Op deze manier kan gesynchroniseerd worden, terwijl een aantal wijzigingen niet meegenomen<br />

worden. Als een file <strong>voor</strong>komt in meerdere envelopes dan leidt dit tot de volgende lijst:<br />

base<br />

original<br />

neighbor<br />

labored (new base for next merge)<br />

Pagina: 116 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

original<br />

neighbor<br />

labored (new base for next merge)<br />

····<br />

····<br />

labored<br />

labored (edit conflict and wrong solution solving)<br />

<strong>Climbexion</strong> moet mogelijk zo gemaakt worden dat de volgorde van originals en neighbors in deze<br />

lijst overeenkomt met de volgorde van de changesets in het andere project.<br />

Deze mogelijkheid om meerdere envelopes over te nemen in één enkele wordt misschien niet<br />

meteen geïmplementeerd in <strong>Climbexion</strong>. Dus zal men dit moeten realiseren met comrades, en vindt<br />

er geen "indikking" plaats waarbij uiteindelijk alleen de laatste labored version wordt overgedragen<br />

naar transfer en team-drawer.<br />

Optimistisch als altijd heb ik slechts één “edit” versie opgenomen in deze lijst, maar er mogen er<br />

meerdere zijn.<br />

Flexibiliteit is vereist. Vaak zal er een mix zijn van overgenomen wijzigingen, en een keuze <strong>voor</strong><br />

andere oplossingen. Bij<strong>voor</strong>beeld een wijziging die geïmplementeerd is gedurende een development<br />

activiteit: het streven bij zo'n wijziging is om de complexiteit van de software zo klein mogelijk te<br />

houden. Maar bij een wijziging laat in de verificatie fase is het streven primair om zo weinig<br />

mogelijk regressie te veroorzaken. Dit wordt bereikt door “defensive programming” en door de<br />

wijziging zo klein mogelijk te houden. Als een wijziging wordt overgenomen in een backbone<br />

project, dan kan de focus verschuiven omdat in een backbone project de nadruk ligt op het<br />

minimaliseren van de totale complexiteit, en reusability waar die bij de laatste fasen van het designin<br />

project ligt bij het minimaliseren van regressie en te wijzigen code. Ook het implementeren van<br />

een feature dat geselecteerd kan worden is met behulp van een configuratie file of andere vormen<br />

van diversity kan in een backbone project anders zijn dan in een design-in project.<br />

Pagina: 117 / 230<br />

Overnemen van een wijziging uit een ander project


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

In NXP wordt een systeem van problem tracking gebruikt waarin sibling relaties mogelijk zijn <strong>voor</strong><br />

problem reports en change requests, en is er regelmatig overleg of problemen gevonden in het éne<br />

project moeten worden overgenomen als sibling in het andere. Ook bij Philips CE was men hierop<br />

zeer alert.<br />

Daarnaast is het nog mogelijk dat men oplossingen uit andere projects overneemt, zonder dat hierbij<br />

een envelope of een change request of een problem report in de andere drawer een rol speelt. Een<br />

original is dan mogelijk niet eenduidig aan te wijzen. Onder die omstandigheid is het waarschijnlijk<br />

niet correct om de file waaruit de oplossing wordt overgenomen, om die een neighbor te noemen.<br />

envelope copy<br />

1. Full snapshot copy<br />

2. Existing envelope supplies original and neighbor<br />

3. Apply merge<br />

4. Snapshot copy: some differences are additional base for envelope E<br />

5. Transfer copy: envelope E content<br />

6. Transfer copy: envelope E content<br />

2.4.7 Undo envelope<br />

Een envelope die erg op een adopt envelope lijkt is de undo envelope. Ook deze refereert naar een<br />

andere envelope, alleen de toewijzing van originals en neighbors is anders.<br />

● De labored versions in de gerefereerde envelope worden de originals in de eigen envelope<br />

● De base versions in de gerefereerde envelope worden de neighbors in de eigen envelope<br />

Pagina: 118 / 230<br />

envelope copy


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

2.4.8 synchroniseren van eigen packages met die van een sisterproject<br />

(adopt merge)<br />

File Original Base neighbor Action<br />

File1 File1.A File1.C File1.E merge<br />

File2 File2.C File2.C File2.E copy<br />

File3 File3.D File3.C File3.A merge<br />

Merge_copy package from Project Old to Project New<br />

Het betreft hier wijzigingen op de eigen packages.<br />

De integrator begint met twee snapshots (of baselines of tags) te kiezen in de andere drawer, één<br />

<strong>voor</strong> de originals, en één <strong>voor</strong> de neighbors. Dan vindt er een query plaats die niet erg simpel is. Het<br />

synchroniseren van name en folder reference wijzigingen, en synchroniseren als een element<br />

intussen slechts in één van de drawers <strong>voor</strong>komt: mijns inziens is een algoritme hier niet toereikend,<br />

iemand moet een beslissing nemen, en <strong>Climbexion</strong> levert slechts een conflict lijstje.<br />

Zo gaat de integrator te werk.:<br />

● Creëer een envelope en refereer naar een merge work-item<br />

● kopieer de base van de center-drawer naar je satellite (exact copy)<br />

● Als baseline Tn-1 van het sister-project de vorige keer geen neighbor was of als import of<br />

export limitations sindsdien gewijzigd zijn: importeer het package met baseline Tn-1 in de<br />

betreffende merge-import drawer. Dit worden de originals<br />

● Importeer het package in de betreffende merge-import-drawer, met tag Tn.<br />

● Voer eventuele undo envelopes uit <strong>voor</strong> wijzigingen die niet overgenomen moeten worden.<br />

Dit doen we in de merge-import-drawer (via een merge-import satellite natuurlijk).<br />

● Merge: original tag Tn-1, neighbor is de tip van de merge-import drawer, base de tip van de<br />

team satellite. De merge vindt plaats in de team satellite. Eventueel edit (mergeables en<br />

Pagina: 119 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

unmergeables). Het resultaat komt in de tip van satellite en envelop.<br />

● build, test, improve, resynchronize, transfer.<br />

Undo envelopes kun je toepassen op de merge-import-drawer <strong>voor</strong>dat je een merge uitvoert, of op<br />

de labored versions in de team-drawer satellite nadat de merge is uitgevoerd. In het laatste geval<br />

loop je het risico dat je eerst conflicten oplost tijdens merge, en daarna nog eens tijdens undo, <strong>voor</strong><br />

conflicten die gerelateerd zijn aan de wijzigingen die je niet wilt hebben. Verder zijn er mogelijk<br />

wijzigingen gerealiseerd in beide subprojects, door envelopes te adopteren. Undo daarvan kan het<br />

beste plaatsvinden op de merge-import-drawer. Undo hiervan in een team-drawer satellite is<br />

ongewenst: daarin wil je de reeds gerealiseerde wijziging behouden. Ook zijn de wijzigingen in het<br />

sister project mogelijk iets anders geïmplementeerd dan in de team-drawer: merge en daarna al dan<br />

niet undo levert dan een chaos op. Conclusie: undo pas je toe op de merge-import-drawer.<br />

De afkomst relaties blijven behouden door de query (inclusief export-drawer en sister-project) op te<br />

nemen in de envelope, en door original en neighbor in de envelope op te nemen bij de betreffende<br />

files in de envelope.<br />

De volgende keer dat vanuit dezelfde drawer gesynchroniseerd wordt, kan de base <strong>voor</strong> de undo<br />

operaties het original worden: de synchronisatie is dan adjacent ten opzichte van de <strong>voor</strong>gaande<br />

synchronisatie. Als je <strong>voor</strong> het eerst synchroniseert vanuit een sister-project waaruit het package<br />

door kopiëren is ontstaan, dan is de synchronisatie adjacent op de kopieer actie. De eerste versions<br />

in de eigen courses zijn dan de originals. Synchronisaties hoeven niet per definitie adjacent ten<br />

opzichte van elkaar te zijn. Als je bij een synchronisatie een willekeurig snapshot opgeeft in de<br />

drawer vanwaaruit gesynchroniseerd wordt, dan worden de wijzigingen vanaf daar tot aan de tip<br />

overgenomen. Als je in plaats van de tip een snapshot opgeeft, dan worden de wijzigingen tussen<br />

beide snapshots overgenomen: het eerste snapshot definieert de originals, het tweede de neighbors.<br />

Pagina: 120 / 230<br />

Team-drawer na Transfer<br />

original en neighbor zijn primair geregistreerd in de envelope, en daardoor indirect in het event.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

Om dit te automatisch goede synchronisatie aansluiting te realiseren moeten de synchronisaties die<br />

een package ondergaat worden opgeslagen. Hier<strong>voor</strong> wordt de drawer merge-imports gebruikt,<br />

waarin de changesets <strong>voor</strong>komen die de vorige keer gebruikt zijn.<br />

Zo'n synchronisatie vindt enkele malen plaats bij de start van een project, daarna worden<br />

wijzigingen overgenomen door de envelopes over te nemen. Soms wordt een backbone project op<br />

deze manier <strong>voor</strong>zien van de wijzigingen in een design-in project.<br />

Pagina: 121 / 230<br />

Envelope <strong>voor</strong> file1 en file2<br />

Adopt merge schema


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

2.4.9 Gemeenschappelijk beheerde packages.<br />

Het avs (audio video system): de besturingslaag (eigenlijk moet ik zeggen: de server) waarin de<br />

drivers huizen, bevat packages die worden bijgehouden door NXP en enkele door de klant, of een<br />

third party.<br />

● Bij<strong>voor</strong>beeld Horcom gebruikt een model van alle audio en video paden. Dit model is min<br />

of meer exclusief <strong>voor</strong> één enkel type televisie, maar een groot deel modelleert de structuur<br />

van de NXP chip. Het model van de av-stromen wordt gerealiseerd met Koala interfaces:<br />

waar een audio- en/of video- stroom loopt tussen hardware componenten, daar zit een<br />

Horcom interface paar tussen de driver besturings-componenten. De besturingscomponenten<br />

vormen op die manier een soort puzzelstukjes die nog in elkaar gezet moeten<br />

worden. Dat doe je door de ingang van een component te verbinden met een uitgang van een<br />

directe <strong>voor</strong>ganger, en dat dan <strong>voor</strong> alle ingangen en uitgangen. De component waarin al die<br />

verbindingen liggen wordt zowel door de klant als door NXP bijgehouden, maar de<br />

eigenaar van het master project is eigenaar van deze integratie component. De component<br />

wordt als package uitgegeven door de eigenaar.<br />

● De diversity van dit package is gecentraliseerd in een package dat weliswaar bestaat uit cd<br />

files, en c files, maar dat wordt bijgehouden als een invulformulier, waarop <strong>voor</strong> elk item<br />

een waarde of een functie aanroep wordt ingevuld. Ook dit package is van de eigenaar van<br />

het master project, maar wordt ook <strong>voor</strong>namelijk door NXP teams bijgehouden.<br />

Een ander <strong>voor</strong>beeld:<br />

● Een team in India en een team in Nederland werken beide aan hetzelfde package en hebben<br />

ieder een team-drawer met satellites.<br />

Er zijn meerlingen methoden denkbaar.<br />

Meerlingen zijn bij<strong>voor</strong>beeld te realiseren met een gemeenschappelijke team-drawer (commondrawer),<br />

waarin de teams hun wijzigingen mengen, waarna ieder synchroniseert (exact copy) met<br />

de tip van de common-drawer.<br />

● Een discipline zou kunnen zijn dat eerst de team-drawer up-to-date gebracht wordt met<br />

behulp van envelopes. De common-drawer heeft een transfer-drawer. Nadat de overdrachten<br />

van de team transfer-drawer naar de team-drawer klaar zijn, vindt een merge copy plaats van<br />

de team-drawer naar de transfer-drawer van de common-drawer (original: de tag in de teamdrawer<br />

direct na de vorige keer, neighbor: de tip van de team-drawer), en na acceptatie<br />

checks (builds en mogelijk tests) een overdracht naar de common-drawer. Dan vindt een<br />

exact copy plaats van common-drawer op team-drawer. Dan wordt de tag <strong>voor</strong> de originals<br />

van de volgende keer gemaakt.<br />

● Iedere envelope wordt na acceptatie in de team transfer-drawer aangebracht in de commondrawer,<br />

indien nodig worden daartoe base en labored paren toegevoegd aan de envelope. De<br />

team-drawer wordt bijgewerkt als clone van de common-drawer: alle changesets in het<br />

common-drawer worden ook changesets in de team-drawer. De team transfer-drawer wordt<br />

daarna met exact copy bijgewerkt. Voor envelopes betekent dit dat ze pendelen tussen<br />

common-drawer, en de team transfer-drawer en satellites die bediend worden door de<br />

common-drawer.<br />

● Variatie op de vorige werkwijzen: Eerst brengen alle teams hun wijzigingen aan op de<br />

common-drawer, daarna pas nemen met exact copy ze het resultaat over in hun eigen team-<br />

Pagina: 122 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

drawer. Er is nu een moment waarop alle team-drawers inhoudelijk dezelfde tip hebben.<br />

● Adjacency: wijzigingen <strong>voor</strong> de common-drawer hebben als original de vorige exact copy<br />

vanuit de common-drawer.<br />

Het geheel is natuurlijk gevoelig <strong>voor</strong> een probleem dat gelijktijdig wordt ontdekt en opgelost in<br />

meerdere teams, ieder op zijn eigen wijze, liefst ook nog met zijn eigen work-item, en zijn eigen<br />

beschrijving. Soms kun je dat niet <strong>voor</strong>komen. Dan moet je de software herstellen, en proberen te<br />

vermijden dat je blijft zitten met een dubbele gemixte oplossing.<br />

2.4.10 Baseline samenstellen<br />

Zolang er een wekelijkse baseline werd uitgegeven, kregen wij (de software engineers) op<br />

donderdag te horen: “Vandaag en morgen niets inchecken, we gaan de baseline klaarmaken”. Er<br />

mochten dan nog slechts problemen worden ingecheckt, die noodzakelijk waren om de baseline te<br />

vervolmaken.<br />

Nu we drawers hebben kunnen we in één zo'n drawer en zijn satellites een baseline <strong>voor</strong>bereiden. In<br />

de team-drawer kan dan gewoon worden doorgegaan. Een consequentie is wel, dat je in de teamdrawer<br />

geen baselines van eigen packages kunt herkennen, de eigen baseline is namelijk niet altijd<br />

een snapshot in de eigen team-drawer, terwijl de baselines van geabonneerde packages er wel in<br />

terug te vinden zijn. Mogelijk worden ook de baseline reports alleen bijgehouden in de exportdrawer<br />

en niet in de team-drawer.<br />

In de officiële export-drawer wil je liefst geen tussenresultaten, maar uitsluitend baselines. Er is dus<br />

een extra center nodig: de baseline-drawer, waarin de wijzigingen worden opgebouwd tot de<br />

baseline klaar is. Daarna wordt met “exact copy” de export-drawer zelf bijgewerkt. De<br />

<strong>voor</strong>bereidende envelopes pendelen hier dus tussen baseline satellites en baseline-drawer.<br />

Het kan zijn, dat er <strong>voor</strong>af afspraken zijn gemaakt over de inhoud van de baseline. Het snapshot van<br />

de tag van woensdag op donderdag kan wijzigingen bevatten waarvan afgesproken is dat die nog<br />

niet ingaan, ook kan dit snapshot wijzigingen missen die er nog met prioriteit in moeten komen.<br />

Niet alles is expliciet afgesproken, dan geldt in principe <strong>voor</strong> de wijzigingen: “hoe eerder hoe<br />

beter”, hoewel dit <strong>voor</strong> de ene wijziging meer geldt dan <strong>voor</strong> een andere.<br />

Het kan zijn dat wijzigingen niet genoeg zijn uitgekristalliseerd <strong>voor</strong> een baseline en daarom niet<br />

meegenomen worden: ze falen in de baseline tests. Ook kan het zijn dat wijzigingen falen in een<br />

baseline test en met prioriteit verbeterd worden, omdat het ernaar uitziet dat dat kan, en/of omdat<br />

het afgesproken is.<br />

Dank zij het gebruik van een baseline-drawer en zijn satellites is het geen probleem om met<br />

prioriteit dingen te doen, terwijl het gewone werk doorgaat. De envelopes die daarbij gebruikt<br />

worden kunnen deels gebruikt worden om daarna zonder prioriteit de team-drawer te verbeteren,<br />

op dezelfde manier als waarop wijzigingen uit een ander project worden overgenomen.<br />

Allereerst wordt met exact copy uit de team-drawer een base gemaakt in de baseline-drawer.<br />

Undo operaties gebruiken de envelope waarmee de wijziging is aangebracht in de team-drawer. De<br />

labored version uit de envelope is het original in de merge, de base version uit de envelope is de<br />

neighbor in de merge, en de tip version in de satellite van de export-drawer is de base van de merge.<br />

De volgorde der envelopes: de timestamps van de changesets, de meest recente eerst, denk ik, <strong>voor</strong><br />

Pagina: 123 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

de zekerheid.<br />

Verbeter acties vinden verder plaats zoals in de team-drawer en zijn satellites.<br />

Tenslotte kan de baseline, met inachtneming van de export limitations gekopieerd worden naar<br />

export-drawers.<br />

2.4.11 Project dependencies.<br />

Binnen een product familie kennen we generaties, <strong>voor</strong> de software van NXP is een nieuw<br />

ontworpen chip een nieuwe generatie met een nieuw reference design / backbone project en daar<br />

van afgeleid de design-in projects. Wijzigingen in de design-in projects die algemeen bruikbaar zijn,<br />

zoals opgeloste fouten, worden ook aangebracht in het backbone project. Tussen het backbone<br />

project en de design-in projects wordt dan ook aardig wat gesynchroniseerd, en worden envelopes<br />

over genomen.<br />

Ook bij grote klanten wordt er vaak gewerkt met een fictief project: het backbone project. Ook hier<br />

is een nieuwe generatie (of een andere leverancier) van de elektronica vaak de reden om een nieuw<br />

backbone project te beginnen. Wijzigingen in design-in projects worden, als ze algemeen bruikbaar<br />

zijn, ook aangebracht in de backbone drawer. Nieuwe design-in projects worden gebaseerd op het<br />

backbone project. Van de software van het backbone project wordt geëist dat ze compileerbaar is<br />

<strong>voor</strong> alle layer builds, en alle product builds, en mogelijk dat delen ervan uitvoerbaar zijn op enkele<br />

testplekken. Synchronisatie en het overnemen van envelopes komen hier systematisch <strong>voor</strong>.<br />

Bij deze grote klanten participeert NXP niet alleen in de design-in projects, maar ook in het<br />

backbone project. In de eerste projects baseert NXP zijn packages op het eigen reference design<br />

project, later worden deze klanten bedient met packages die zijn gebaseerd uit het backbone project<br />

van de klant.<br />

Pagina: 124 / 230<br />

Baseline samenstellen met 2 ontwikkelaars en een tester


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

Een opmerking over het backbone / reference design project.<br />

Zolang design-in projects uitsluitend wijzigingen overnemen uit dit project, en wijzigingen ook<br />

invoeren in dit project, fungeert het project als een buffer tussen de diverse design-in projects. Er is<br />

een tendens om wijzigingen uit te wisselen tussen design-in projects, omdat het beleid <strong>voor</strong><br />

wijzigingen tussen design-in projects overeenstemt. Na een start wordt dit beleid al gauw:<br />

“minimaliseer de wijziging”. Bij een backbone project is het beleid meer: “houdt de totale<br />

complexiteit zo laag mogelijk”. Het is immers steeds opnieuw een uitgangspunt <strong>voor</strong> andere<br />

projects. Dit verschil in beleid maakt dat er vaak manueel gewijzigd wordt, als wijzigingen van een<br />

design-in project worden doorgevoerd in het reference design. Soms als aanvulling op een merge,<br />

soms zonder merge.<br />

Een opmerking over adopts. Een nieuwe generatie chips begint met een design project. En daarmee<br />

een nieuwe reference design drawer. Deze begint met een import uit een <strong>voor</strong>gaand reference<br />

design. Kort na het begin van een design project, als de initiële integratie een werkend geheel heeft<br />

opgeleverd, worden de meer rigoureuze wijzigingen uitgevoerd zoals uitbreidingen, en redesign,<br />

nieuwe drivers <strong>voor</strong> nieuwe hardware enzo<strong>voor</strong>t. Dit vindt <strong>voor</strong> het grootste deel plaats in het<br />

reference design / backbone project. Zolang herstructurering zich beperkt tot folder herindelingen,<br />

en hernoemen tot andere namen <strong>voor</strong> elements, kan <strong>Climbexion</strong> de samenhang met drawers van<br />

<strong>voor</strong>gaande projects vasthouden. Als hernoemen en herstructureren plaatsvindt op entiteiten binnen<br />

files, bij<strong>voor</strong>beeld procedures, die splitsen of verhuizen naar andere files, of waarvan de naam<br />

integraal gewijzigd wordt, dan heb je niets aan <strong>Climbexion</strong>: de samenhang met andere chip<br />

generaties is verloren gegaan. Na het design project beginnen de design-in projects, en daarmee de<br />

adopts. Binnen de chip generatie is adopt met “mechanische” middelen zoals een merge programma<br />

min of meer betrouwbaar, maar als je na de beginfase nog wijzigingen uit andere chip generaties wil<br />

overnemen dan moet je bedacht zijn op problemen die niet altijd met een merge programma zijn op<br />

te lossen.<br />

2.4.12 Informatie, werkelijkheid, gedistribueerd systeem<br />

De synchronisaties tot nu toe betreffen een uitbreiding met één snapshot. Zelfs als wijzigingen over<br />

een langere periode worden overgenomen, dan worden ze ingedikt tot één enkele merge of copy.<br />

Daarnaast is er een synchronisatie methode die elk detail van de courses kopieert. Dit wordt cloning<br />

genoemd. De eerste toepassing is natuurlijk het testen van <strong>Climbexion</strong>: het uitgangspunt van een<br />

test wordt gekopieerd en de kopie wordt gewijzigd door de test. De tweede toepassing betreft het<br />

leren van <strong>Climbexion</strong>, waarbij de leerling wijzigt in een kopie. Als je behalve het kopiëren ook in<br />

staat bent de kopie van een drawer af en toe of geregeld aan te vullen met met de de laatste<br />

uitbreidingen van de courses, dan is <strong>Climbexion</strong> aardig op weg om geïmplementeerd te kunnen<br />

worden als zuiver gedistribueerd systeem. Nu is het de vraag of zo'n kopie exact gelijk is aan het<br />

origineel. Een bit <strong>voor</strong> bit vergelijking zegt waarschijnlijk: ja hoor ze zijn precies gelijk. En zo is<br />

het ook, beide geven ze de historie weer die het origineel heeft ondergaan. Dat is ook meteen het<br />

verschil: de clone heeft die historie helemaal niet ondergaan, het is louter informatie, over een<br />

werkelijkheid die zich heeft afgespeeld in het origineel. De event en transaction timestamps in de<br />

clone zijn pure “valid times” waar ze in het origineel zeker ook “transaction times” zijn. Stel dat je<br />

besluit om op clones wijzigingen toe te staan, dan bevat de course events die de werkelijkheid van<br />

het origineel weergeven, en events die die de werkelijkheid van de clone weergeven, dan is dit een<br />

vervaging. Ik vind het een kleine frustratie van één van de uitgangspunten: “het opslaan van de<br />

Pagina: 125 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

historie, je weet nooit waar het goed <strong>voor</strong> is”, ik raad het af, wees liever precies in de duiding van<br />

de werkelijkheid. Een clone hoort uitsluitend informatief te zijn, en geen zelfstandige ontwikkeling<br />

te hebben. Je kunt altijd nog een nieuwe drawer maken die is gebaseerd op een snapshot van de<br />

clone, en daarin wijzigen.<br />

Ik denk dat, als clones volledig geïmplementeerd worden, dat het dan het beste is om <strong>Climbexion</strong> de<br />

transaction time van een synchronisatie te laten bijhouden. De transaction time is de tijd waarop de<br />

clone wordt uitgebreid met de laatste course gegevens. Omdat een clone niet altijd up-to-date is kan<br />

hij aanleiding zijn tot fouten en misverstanden. Als je weet waarom een fout is gemaakt, dan kun je<br />

beoordelen of er mogelijk nog meer fouten zijn gemaakt. (Kennis van de oorzaak kan soms<br />

verontrustend en soms geruststellend zijn). De transaction time kan daarbij mogelijk helpen, samen<br />

met de discipline om een clone consequent bij te werken vanuit één referential drawer, bij <strong>voor</strong>keur<br />

het origineel, en niet vanuit verschillende (niet volledig up-to-date) clones.<br />

Om een volledig gedistribueerd systeem avant la lettre te maken is nog het volgende nodig. Naast<br />

de drawer die gekloond wordt zijn er ook nog de pools met versions en kins. Het moet ook mogelijk<br />

zijn om een uittreksel uit een pool te maken en te onderhouden in een “local pool”, die de drawers<br />

van de locatie bedient. Deze bediening betreft zowel de clones, als de lokale originelen.<br />

Wijzigingen moeten in andere local pools worden doorgevoerd, als op die locatie wijzigingen<br />

worden overgenomen. Dit betreft zowel snapshotgewijze overnames, als coursegewijze overnames.<br />

Envelopes horen in principe bij een constellation. Ze horen zichtbaar te zijn <strong>voor</strong> ieder die de<br />

center-drawer onderhoudt of analyseert. Voor de pool met envelopes geldt waarschijnlijk hetzelfde<br />

als <strong>voor</strong> de pool van versions: als er op locatie references staan naar envelopes dan moet de<br />

envelope zich in de betreffende local pool bevinden. Daarboven geldt <strong>voor</strong> een envelopes die<br />

“prepared” of “transfered” is, dat die teamgenoten moet kunnen informeren, zelfs als er nog geen<br />

reference bestaat in hun locaties.<br />

Als changesets bijgehouden worden in één element in een drawer, dan is een drawer de eenheid van<br />

cloning. Mochten we besluiten om ieder package een changeset element te geven dan is een<br />

package de eenheid van cloning, en is er in een drawer een mix van clones en originals mogelijk.<br />

Geabonneerde packages in een team drawer zouden een clone kunnen zijn van zo'n package in de<br />

import-drawer, tenminste als je baseline supplements realiseert in de import-drawer. Als je baseline<br />

supplements realiseert in de team-drawer, dan kunnen import-drawers clones zijn van exportdrawers.<br />

Vooralsnog lijkt er geen belangrijke toepassing te zijn <strong>voor</strong> cloning per package.<br />

Als het komt tot een vergelijking tussen een lokale clone van een center-drawer en daarop lokale<br />

branches ten opzichte van een center-drawer enerzijds en alleen lokaal een satellite anderzijds dan<br />

heb ik het volgende bedacht.<br />

1. In een satellite moet je met exact copy een base creëren <strong>voor</strong> de volgende wijziging. In een<br />

lokale clone is de base <strong>voor</strong> de branch reeds aanwezig.<br />

2. Als je tussentijds of tenslotte je wijzigingen gaat baseren op andere snapshots dan betekent<br />

dit <strong>voor</strong> <strong>Climbexion</strong> dat een nieuwe base wordt overgenomen uit de center drawer, dit<br />

overnemen hoeft niet bij een DAG<br />

3. Een clone moet worden bijgehouden. Als je er geen hebt hoef je die ook niet bij te houden.<br />

4. De privacy lijkt gelijk. De satellites blijven privé op je PC, maar de clone met branches ook.<br />

En slechts de resulterende changesets worden overgedragen naar de community.<br />

5. De clone biedt een volledige historie, met <strong>voor</strong>delen <strong>voor</strong> offline werken, de satellite en ook<br />

de branch slechts de historie van de snapshots die nodig waren <strong>voor</strong> de wijzigingen.<br />

Pagina: 126 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

6. Een branch is altijd afhankelijk van een trunk, <strong>voor</strong> bases en originals , een satellite bevat<br />

zelf alle relevante informatie. Een course in een drawer is eenvoudiger dan een DAG.<br />

7. Een drawer is flexibeler dan een branch, want je kunt een satellite (her)synchroniseren met<br />

een center-drawer, en met een transfer-drawer, zelfs met een drawer van een ander project.<br />

Een branch aan een clone kun je synchroniseren met de clone. (zie afbeelding).<br />

8. Met drawers is er een uniforme methode <strong>voor</strong> family members, projects, satellites en<br />

dergelijke: er is één begrip: de drawer. Met DAG's zijn er twee begrippen: de DAG en de<br />

branch. Je moet min of meer arbitraire beslissingen nemen wanneer je een nieuwe DAG<br />

begint, en wanneer een nieuwe branch, en bovendien moet je besluiten of de trunk van een<br />

DAG een clone is van een branch uit een andere DAG.<br />

9. Je kunt op een drawer de security van het file system op toepassen. Dit kan niet bij een<br />

branch. Het <strong>revision</strong> <strong>control</strong> systeem moet zijn eigen zijn eigen security onderhouden, als<br />

branches anders toegankelijk moeten zijn dan trunks, of als iedere branch zijn eigen<br />

toegangs-rechten heeft.<br />

Pagina: 127 / 230<br />

Satellite versus clone/branch<br />

manier van werken: zoals beschreven <strong>voor</strong> satellites


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

Al met al lijken branches qua performance superieur ten opzichte van de satellites. Immers als je<br />

werkt met steeds dezelfde satellite, dan kun je niet werken aan meerdere problemen tegelijk, en<br />

werk je met een satellite per probleem, dan is er zeker een performance achterstand. Ik hoop dat het<br />

effect van punt één beperkt is, omdat courses geen versions bevatten, maar slechts verwijzingen<br />

ernaar, maar bij de start van een satellite wordt een compleet snapshot gekopieerd, en niet slechts de<br />

wijzigingen ten opzichte van de vorige keer. Punten twee en drie zullen elkaar wel opheffen qua<br />

performance, <strong>voor</strong> een gebruiker is punt drie een aparte handeling, maar bij punt twee is de actie<br />

van <strong>Climbexion</strong> mogelijk geïntegreerd met de merge zelf. Voor thuiswerken en werken op reis is het<br />

vijfde punt ook een <strong>voor</strong>deel, maar niet uitgesloten als je werkt met een satellite. Punt zes lijkt<br />

<strong>voor</strong>al een implementatie <strong>voor</strong>deel <strong>voor</strong> de ontwikkelaar van <strong>Climbexion</strong>, en misschien ook <strong>voor</strong><br />

een gebruiker die niet echt een lokale clone nodig heeft, er zou toch een tendens kunnen zijn om te<br />

gaan werken met “clouds”.<br />

Al met al lijkt een feature waarbij een satellite zich kan funderen op een snapshot in een andere<br />

drawer, zonder dat daarbij het snapshot daadwerkelijk wordt gekopieerd zeer wenselijk. Op het<br />

performance verlanglijstje staat primair de wens om een drawer te beginnen met een snapshot<br />

reference, maar misschien zou in principe elke base tag een reference mogen zijn. Of misschien<br />

moet ik <strong>voor</strong> satellites een uitzondering maken en branches toestaan.<br />

Een simpel snapshot model zou volstaan. De snapshots vormen bijna een caterpillar tree. Een<br />

caterpillar tree heeft een lange stam en daaraan korte branches van één edge. De stam bevat<br />

adjacent synchronisaties van de satellite met de de center-drawer, in de branches worden de<br />

problemen opgelost en de envelopes <strong>voor</strong>bereid. De korte branches zijn wel wat langer dan één<br />

snapshot, dus het is geen echte caterpillar tree. Door de structuur simpel te houden blijft het<br />

nummeren van snapshots simpel. Bij<strong>voor</strong>beeld, de snapshots van de stam krijgen een volgnummer,<br />

de korte takken heten naar het probleem dat ze oplossen, en het snapshot waarop ze zich baseren.<br />

De snapshots in de branches krijgen een lokaal volgnummer. Het bepalen of twee course items van<br />

een element een ancestor relatie hebben zou simpel moeten zijn, en ook het vinden van een “live”<br />

course item gegeven een snapshot zou zo betrekkelijk simpel moeten zijn, zonder een snapshot tree<br />

te hoeven raadplegen. Voorlopig is dit alles <strong>voor</strong>barig.<br />

Ik zag een promotie video van Linus Torvalds over Git.<br />

Kanttekeningen bij enkele opmerkingen:<br />

Er is de stelling: met clones is backup overbodig.<br />

Het probleem met backups is toch wel dat restore maar zo zelden <strong>voor</strong>komt. Als het eens<br />

onverwacht nodig is, na een crash of zo, dan sta je met het angstzweet op het <strong>voor</strong>hoofd af te<br />

wachten of het allemaal wel goed gaat. Van clones die op locatie daadwerkelijk gebruikt worden,<br />

weet je in ieder geval dat de clone hoogstwaarschijnlijk correct is, en leesbaar. Je hebt dus nog<br />

<strong>voor</strong>namelijk te maken met het probleem dat de clone niet 100 procent up-to-date hoeft te zijn: de<br />

tip van het origineel kun je kwijt zijn. Dit probleem geldt overigens ook <strong>voor</strong> een periodieke backup,<br />

maar mogelijk niet bij een systeem met logging, of bij het gebruik van RAID. Dus een aanvulling<br />

kan gewenst zijn. Zo'n aanvulling kan natuurlijk een werkwijze of procedure zijn waardoor altijd<br />

minstens één clone up-to-date is.<br />

Recovery van een software fout in de climbexion software zelf, of van sabotage of van een fout<br />

tijdens onderhoud door een systeembeheerder, eist mogelijk dat je terug moet naar een eerdere<br />

Pagina: 128 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

versie van een drawer. (Zelf heb ik ooit, in de rol van systeembeheerder, een restore gedraaid in<br />

plaats van een backup, we werkten met een zoon, vader, grootvader systeem, met rouleren van de<br />

backup schijven). Ook moet je er rekening mee houden dat te laat ontdekte fouten kunnen zijn<br />

uitgezaaid in clones, pools, satellites, backups, en log-files, waardoor je terug moet naar een oude<br />

backup. Dit kunnen fouten zijn die geheel of gedeeltelijk de course of development onbruikbaar<br />

maken. De recente historie ben je dan na restore <strong>voor</strong>goed kwijt en moet je mogelijk vervangen<br />

door opnieuw wijzigingen aan te brengen. Ik denk dat ik <strong>voor</strong> de zekerheid toch periodieke backups<br />

zou bewaren.<br />

Veel van de problemen die een recovery veroorzaken zijn te <strong>voor</strong>komen met procedures en<br />

(geprogrammeerde) <strong>control</strong>es, en zo. Maar toch, clones in hun eentje zijn mogelijk geen afdoende<br />

backup middel bij een worst case scenario.<br />

Als belangrijk argument wordt vermeld om met clones te werken: je kunt offline werken, zonder<br />

internet, VPN of intranet. Zo kun je werken in de trein van werk naar huis, en vice versa. Bij NXP<br />

zijn ze niet onder de indruk.<br />

Er is nog enige concurrentie van het systeem “planning-items” of “work-items”: problem reports,<br />

delta requests, en change requests, en de rapportages daarop. Een clone van een deel van dit<br />

systeem kan ook handig zijn. Ook hierin is een ontwikkelingsgang te volgen. Als je zou moeten<br />

kiezen, dan is het maar net wat je gewend bent. Waarschijnlijk hoef je niet te kiezen: als je toch<br />

bezig bent kun je ook hieruit kopiëren wat je nodig denkt te hebben, en dit lokaal opslaan.<br />

De methode om de transaction te zoeken die de fout veroorzaakte is een belangrijke methode, maar<br />

het is niet de enige methode, immers de fout bevindt zich in de tip en kan zonder volledige historie<br />

gevonden worden. Ook als je de envelope kunt aanwijzen waarbij de fout zich begon te<br />

manifesteren, dan is dat vaak een begin: een fout kan ontsloten zijn door de wijziging, en ook kan<br />

het zijn dat te weinig files gewijzigd zijn bij de implementatie van een work-item. De analyse<br />

hier<strong>voor</strong> kun je plegen op de tip, je hebt de complete courses niet nodig. Kortom een clone is<br />

handig maar niet per se noodzakelijk. Soms, bij<strong>voor</strong>beeld bij ontbrekende delta processing, levert<br />

de zoektocht door de snapshots geen resultaat op.<br />

Die volledige historie moet je met een korreltje zout nemen, baselines van niet eigen packages en<br />

adopt merges betekenen een course indikking. De details ervan bevinden zich vaak niet in de teamdrawer.<br />

Import limitations kunnen files weglaten uit een team-drawer maar zijn wel te vinden zijn<br />

in andere drawers. Een internet verbinding is dan wel gewenst. Sommige drawers zijn niet direct<br />

door iedereen benaderbaar, en van de packages die erin worden bijgehouden krijg je slechts die<br />

files waar<strong>voor</strong> geen export restricties gelden. Dan moet je soms mensen benaderen met een vraag<br />

of een probleem. Een telefoon is dan ook wel handig.<br />

Als je wijzigingen wilt overnemen uit sister projects, dan heb je ook daarvan misschien een clone<br />

nodig, maar liefst een internet toegang.<br />

Wat je echt mist is een test omgeving, de lab tafel, de 60 inch televisie, de satelliet schotel en zo. Die<br />

krijg je niet zomaar in en op de trein. Dus testen en debuggen kun je hoogstens met unit tests.<br />

Debuggen op de televisie is toch ook een zeer belangrijk hulpmiddel om de oorzaak van een fout te<br />

vinden. De clone is een halve oplossing, waarbij je slechts een deel van je werk kunt doen. Helaas<br />

ben je offline, dus remote debuggen en testen is ook geen optie.<br />

Pagina: 129 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.4 Werkwijzen<br />

Handicap schatten. De handicap range is 0


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.5 Planning & Tracking en Repositories<br />

2.5 Planning & Tracking en Repositories<br />

2.5.1 Introductie<br />

Work-items (of planning-items) zijn interessant omdat er items zijn waarnaar verwezen wordt in<br />

envelopes en patches en mogelijk satellites. Zo zijn er development, delta-process, change,<br />

problem, test, maintenance, integration, patch items en misschien nog wel meer. De items waarnaar<br />

verwezen wordt zouden in principe net zo lang moeten bestaan als het <strong>revision</strong> <strong>control</strong> system zelf,<br />

om te <strong>voor</strong>komen dat de verwijzing iemand in de toekomst blij maakt met een dode mus. Van het<br />

één komt het ander, als je deze items opneemt in een eeuwig durende file, waarom dan niet alle<br />

work-items waarop in het project het werk en de <strong>voor</strong>tgang wordt ge<strong>control</strong>eerd?<br />

Een work-item heeft een <strong>voor</strong>traject. De meeste Problem reports komen <strong>voor</strong>t uit tests door testers,<br />

sommigen uit reviews of uit debugging door ontwikkelaars, sommigen uit field calls. We maken<br />

nog onderscheid of het problem is gevonden door het eigen team, of door een ander. Change<br />

requests komen <strong>voor</strong>t uit gewijzigde inzichten, of een gewijzigde markt, en uiteindelijk via de<br />

opdrachtgever. Delta-process en Nieuwbouw items komen <strong>voor</strong>t uit requirements en uit een nieuwe<br />

omgeving. Patch items kunnen <strong>voor</strong>tkomen uit een behoefte een bepaalde <strong>voor</strong>tzetting in de<br />

software ontwikkeling te faciliteren. En zo moet er soms verschillend over worden gerapporteerd.<br />

Een opdracht om te testen kan wel een work-item zijn, maar is geen opdracht om software te<br />

wijzigen. Een integratie opdracht kan betekenen dat een bepaalde drawer wordt bijgewerkt met<br />

bestaande software.<br />

Work-items hebben een W.B.S. (work break down structure). Er is een W.B.S. als een work-item<br />

moet worden gesplitst om te worden uitgevoerd door meerdere subprojects. Voor wat betreft items<br />

die leiden tot een wijziging van de center-drawer of tot patches geldt in ieder geval dat ze moeten<br />

worden opgesplitst tot er een item <strong>voor</strong> een enkele package is bereikt. Een item dat opgedeeld is<br />

blijft zelf bestaan. Zijn status is de gezamenlijke status van zijn onderdelen. En het is klaar als alle<br />

onderdelen klaar zijn.<br />

Op een work-item kunnen activities worden uitgevoerd. Zo'n activity wordt gekenmerkt door een<br />

stadium. Voor de meeste work-items is er een vastgesteld arsenaal aan te doorlopen stadia. De<br />

<strong>voor</strong>tgangsmanager heeft enige speelruimte <strong>voor</strong> stadium overgangen, zoals terugverwijzen naar<br />

een <strong>voor</strong>gaand stadium, het item aborteren, het item op ijs zetten en zo. In NXP geldt: activities<br />

worden gekenmerkt door twee stadia. Bij het stadium “analyze” hoort het stadium “analyzed”, bij<br />

het stadium “implement” behoort het stadium “implemented”, na een gebiedende wijs volgt een<br />

voltooid deelwoord. Alleen start en end stadia zijn singles. Een gebiedende wijs stadium wordt<br />

gestart door de <strong>voor</strong>tgangs-manager die iemand aanwijst om de betreffende activity uit te voeren en<br />

daartoe een opdracht formulering kan toevoegen aan het item. Degene die de opdracht krijgt<br />

probeert zo snel mogelijk een verslagje toe te voegen aan het work-item, en vult enige attributes in,<br />

om daarna het bijbehorend voltooid deelwoord stadium te starten, zodat de <strong>voor</strong>tgangsmanager<br />

weer aan zet is. Als neveneffect (gezien vanuit het work-item management system) zijn er dan in de<br />

wereld, – bij<strong>voor</strong>beeld in het <strong>revision</strong> <strong>control</strong> system –, dingen veranderd, getest of uitgezocht.<br />

Misschien is het beter om algemene voltooid deelwoorden te gebruiken , die <strong>voor</strong> alle stadia gelden:<br />

“interrupted” als teruggemeld wordt als de betreffende activiteit om de een of andere reden niet is<br />

voltooid, en “completed” als de uitvoerder vindt dat het stadium met de betreffende activiteit is<br />

Pagina: 131 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.5 Planning & Tracking en Repositories<br />

afgerond. Of misschien zou de uitvoerder een aanbeveling kunnen doen <strong>voor</strong> het volgende stadium:<br />

dus “verified” met als aanbeveling: “for baseline” of “implement again”; en “analyzed” met als<br />

aanbeveling “reject” of “analyze again” of “implement”, of “break down”.<br />

De ontwikkeling van de WBS en het doorlopen van stadia vindt gelijktijdig door elkaar plaats.<br />

Bij<strong>voor</strong>beeld een analyse activity kan leiden tot een ontwikkeling van een WBS structure van het<br />

work-item ten behoeve van daarop volgende implement activities.<br />

In TV software, en in de teams herkent men een aantal competences, dwars door de lagen en de<br />

teams heen kan men spreken over front-end, audio, video, performance, start-up, zapping<br />

enzo<strong>voor</strong>t. De competences zijn nodig <strong>voor</strong> een work-item, om te worden ingeschat <strong>voor</strong>dat het<br />

wordt toegekend aan een subproject, of verdeeld wordt over de subprojects.<br />

De stadia vormen een course of development, ze volgen elkaar op, en als het ene stadium geldt, dan<br />

geldt er geen ander, het zijn successions. De verslagen en de opdracht beschrijvingen die geleverd<br />

worden zijn geen course of development, het ene verslag vervangt niet het andere, alle informatie is<br />

tegelijk geldig, het zijn hoofdstukken die toegevoegd worden. Een attribute als “uren besteed”<br />

bij<strong>voor</strong>beeld. Als het work-item 2 maal de stadia analyze en analyzed doorloopt en de eerste keer<br />

wordt gemeld dat er 3 uur besteed zijn en de tweede keer dat er 2 uur besteed zijn, dan vervangt de<br />

tweede melding de eerste niet: er zijn 5 bestede uren gemeld. Het is geen course maar wel een log.<br />

Activities kunnen een composition structuur hebben. Bij<strong>voor</strong>beeld: in een baseline test worden de<br />

verifying activities van andere work-items uitgevoerd, terwijl het test stadium van het baseline<br />

work-item wordt gerealiseerd. De test activity van het baseline work-item is een compositie van een<br />

aantal verify activities van diverse work-items, dus eigenlijk het omgekeerde van work-break-down.<br />

Zo'n planning en tracking systeem heeft best wel een interessante structuur <strong>voor</strong> een database<br />

ontwerper.<br />

Net als envelopes kunnen work-items worden overgenomen in parallelle subprojects, dus naast<br />

parent/child (w.b.s) relationships kunnen er siblings zijn.<br />

We kunnen ons <strong>voor</strong>stellen dat elk subproject zijn eigen planning & tracking systeem beheert met<br />

work-items. We kunnen het ons niet alleen <strong>voor</strong>stellen, zo was de situatie in de projects waaraan ik<br />

deelnam. Maar WBS, siblings en zo kunnen refereren dan aan items in diverse systemen. Verslagen<br />

en status wijzigingen van children moeten bereikbaar zijn vanuit parents en vice versa.<br />

Belanghebbenden, die notificaties wensen kunnen zich in andere teams bevinden. Het geheel moet<br />

zijn te overzien in het masterproject, ook als items daar niet zijn ontstaan. Distributie en<br />

confidentiality problemen zijn hier een grote uitdaging. Tussen NXP en Philips SC was dit geregeld.<br />

Dit is een separaat systeem, buiten <strong>Climbexion</strong>. In <strong>Climbexion</strong> zijn work-items slechts opgenomen<br />

als attribute in een envelope. Het moet mogelijk zijn dat <strong>Climbexion</strong> <strong>control</strong>eert of het work-item<br />

bestaat en gebruikt mag worden, en om er een verwijzing naar een envelope aan toe te voegen.<br />

Naast de work-items waarnaar verwezen kan worden in envelopes zijn er nog andere shared<br />

phenomena: de packages, projects, teams, mensen en dergelijke. Voor teamwork, fout-reconstructie<br />

en dergelijke vormt een dergelijk systeem een onmisbare aanvulling op <strong>Climbexion</strong>: het is een<br />

ander deel van Software Configuration Management, net als Build Management.<br />

De probleem beschrijvingen en de analyse en implementatie rapporten die aan work-items kunnen<br />

worden toegevoegd zijn natuurlijk alleen dan nuttig als ze ook worden gelezen. Als een rapport<br />

aangeeft, dat een wijziging nogal wat vergt, kan besloten worden om een simpeler oplossing te<br />

Pagina: 132 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.5 Planning & Tracking en Repositories<br />

zoeken, of soms, om de wijziging niet te implementeren, of zelfs om de wijziging terug te draaien,<br />

als er reeds aan begonnen is. Als ieder in het team ze leest , bij<strong>voor</strong>beeld <strong>voor</strong>afgaand aan een<br />

<strong>voor</strong>tgang bijeenkomst dan kunnen mogelijk vroegtijdig problemen met parallelle wijzigingen<br />

gesignaleerd worden. Misschien zijn de wijzigingen dan al ingevoerd, want vaak analyseert en<br />

implementeert iemand meerdere items per dag, maar het is altijd nog eerder dan een signaal uit een<br />

regressie test: volledige regressie tests vinden plaats <strong>voor</strong>dat een audit start. Hoe houd je de<br />

discipline erin? Door elkaar erop aan te spreken als de rapporten niet gelezen blijken te zijn, of als<br />

ze nietszeggend lijken te worden.<br />

Het commentaar dat je kunt invullen als je een activiteit uitvoert moet zinvol zijn. Wat is nu zinvol<br />

commentaar dat je invult <strong>voor</strong> de analyze activity? Bij een gewoon problem report gaat het<br />

allereerst om het reconstrueren van probleem: beschrijf hoe het probleem onder diverse<br />

omstandigheden kan worden gereproduceerd. Dan een afbakening de software die gewijzigd moet<br />

worden, en tenslotte om een inschatting van de impact van de wijziging, en misschien van de<br />

risico's als de wijziging niet en als die wel wordt doorgezet.<br />

Het commentaar dat je kunt invullen als je een activiteit uitvoert moet zinvol zijn. Wat is nu zinvol<br />

commentaar dat je invult <strong>voor</strong> de implement activity? Elders heb ik beschreven dat een merge niet<br />

altijd toereikend is als je wijzigingen overneemt. Hier zou je een poging kunnen doen om te<br />

beschrijven waarmee je zelf rekening hebt gehouden toen je de wijziging implementeerde, en<br />

waarmee iemand rekening moet houden als die jouw wijziging wil adopteren. Dit commentaar moet<br />

natuurlijk al beschikbaar zijn als je een envelope overdraagt, immers een ander zal je gewijzigde<br />

software mogelijk gebruiken als een nieuwe base <strong>voor</strong> zijn eigen wijzigingen, en daarmee jouw<br />

wijzigingen adopteren in zijn satellite. Misschien moet er wel een pseudo-taal <strong>voor</strong> ontwikkeld<br />

worden.<br />

2.5.2 Relaties met envelopes<br />

Envelopes kunnen verwijzen naar work-items, en ook de inverse relatie wordt bijgehouden: een<br />

work-item wijst naar de envelopes.<br />

Een work-item kan het stadium verify met succes hebben doorlopen, en nu is baseline aan de beurt.<br />

In deze stadia, of in een eindstadium, of in een “on ice” stadium mag er geen envelope gecreëerd<br />

worden die naar dit item verwijst, dat mag alleen na een “implement” opdracht en <strong>voor</strong>dat er een<br />

“implemented” melding is geweest. Na een “baselined” melding (met aanbeveling “end”) is het<br />

work-item <strong>voor</strong>goed afgesloten. In eerste instantie zou je zeggen dat er nooit een successor<br />

envelope gemaakt mag worden nadat het resultaat van een work-item baselined is.<br />

Het op te lossen problemen is nu: stel een probleem wordt uiteindelijk opgelost in de baselinedrawer<br />

(en zijn satellites) en pas daarna in de team-drawer. Het work-item raakt dan baselined, maar<br />

is toch nog niet af. Het is pas compleet klaar als de wijziging ook is aangebracht in de team-drawer.<br />

Deze situatie is herkenbaar omdat er envelopes zijn <strong>voor</strong> de baseline-drawer, met een adopt<br />

envelope <strong>voor</strong> de team-drawer. De volgorde is nu bij<strong>voor</strong>beeld: (verify verified), (baseline,<br />

baselined), (finish, finished). Tijdens finish worden de adopt envelopes gebruikt om de wijziging te<br />

implementeren in de team-drawer. Daarna moet het work-item toch wel echt geëindigd zijn. Mocht<br />

er dan nog een fout opduiken, dan wordt die gerealiseerd met een nieuw work-item.<br />

Een work-item mag natuurlijk niet reeds in het stadium verify, gebracht worden als het niet eerst<br />

“implemented” is verklaard (met als aanbeveling “verify”). Voor de opdracht “verify” is het verder<br />

Pagina: 133 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.5 Planning & Tracking en Repositories<br />

nog nodig dat er geen envelopes in uitvoering zijn (behalve één <strong>voor</strong> “finish”), en dat er minstens<br />

één het envelope stadium “implemented” heeft gehaald. Menselijk beslissen lijkt toch noodzakelijk.<br />

Stel je <strong>voor</strong> dat in een succession van twee envelopes de laatste een “undo” realiseert van de eerste,<br />

dan verifieer je toch wat anders, dan wanneer de undo ontbreekt. Of dat in een succession van drie<br />

envelopes de derde een “undo” realiseert van de eerste, dan wil je toch wel een extra verklaring van<br />

voltooiing, <strong>voor</strong>dat “verify” start.<br />

In zijn algemeenheid geldt waarschijnlijk dat de envelopes van een work-item moeten zijn<br />

beëindigd (“implemented” of “rejected”) <strong>voor</strong>dat het “implement” stadium van het work-item wordt<br />

verlaten.<br />

2.5.3 Composite Activities<br />

1. Baseline samenstellen<br />

Het is de bedoeling dat de gegevens in het work-item systeem gebruikt worden bij het<br />

samenstellen van de baseline. Hier volgt een scenario:<br />

● Allereerst wordt met exact copy de tip van de baseline-drawer gelijk gemaakt met die van<br />

de team-drawer.<br />

● Daarna vinden er, in de baseline drawer, undo operaties plaats van wijzigingen die nog niet<br />

vrijgegeven moeten worden. De work-items die hierbij een rol spelen zijn die work-items<br />

die slaan op het betreffende package, die te maken hebben met software wijzigingen, en die<br />

niet “verify” hebben bereikt, of zijn gestopt. Het lijstje “undo”work-items moet het liefst<br />

met een query gemaakt kunnen worden.<br />

● Dan is het zaak de lijst te preciseren. Bij<strong>voor</strong>beeld: sommige work-items moeten alsnog<br />

worden geïmplementeerd en geverifieerd, die moeten uit deze lijst verwijderd worden.<br />

● Dan moet de work-item lijst vervangen worden door een envelope lijst, van die envelopes<br />

in de team-drawer waar<strong>voor</strong> een undo envelope gemaakt moet worden <strong>voor</strong> de baselinedrawer.<br />

Dit is ook een query of een script. Ook moet er een script worden uitgevoerd dat de<br />

undo envelopes <strong>voor</strong> de baseline-drawer prepareert.<br />

● De undo envelopes worden gerealiseerd, waarschijnlijk als comrade envelopes die<br />

gezamenlijk moeten worden overgedragen.<br />

● Vaak worden in de baseline-drawer soms nog (kleine) wijzigingen geïmplementeerd.<br />

● De lijst met work-items in de toestand verify, kan gebruikt worden <strong>voor</strong> het verify deel van<br />

de baseline test.<br />

● Na verificatie (de baseline test) moeten er mogelijk nog meer undo of redo operaties<br />

worden uitgevoerd. Die kunnen verzameld worden door een query <strong>voor</strong> verified work-items<br />

met een “implement” recommendation. De work-items met een “baseline” recommendation<br />

hoeven natuurlijk niet te worden geselecteerd <strong>voor</strong> undo of redo.<br />

● Nadat de baseline is gerealiseerd moet er een “baselined” melding plaatsvinden op de<br />

betreffende work-items, de meeste met aanbeveling “end” maar sommige met de<br />

aanbeveling “finish”. Voor deze laatste moet er een adopt envelope worden aangemaakt die<br />

afgeleid is van de envelope in de baseline-drawer. Dit alles wordt mijns inziens gerealiseerd<br />

met een script, als een composite activity.<br />

● Tenslotte moeten er nog query's worden uitgevoerd ten behoeve van het baseline report: om<br />

de lijst met opgeloste work-items te documenteren.<br />

Pagina: 134 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.5 Planning & Tracking en Repositories<br />

2. Het synchroniseren van de eigen package met die uit een ander project.<br />

Van de work-items in het sister-project die worden overgenomen moeten siblings gemaakt worden<br />

in het eigen project: dat kan deels met een script. Deze siblings moeten uiteindelijk allen op<br />

implemented uitkomen. Meestal zal men synchroniseren met de export-drawer van het sisterproject.<br />

De work-items die erbij betrokken zijn zijn te verkrijgen met een query: alles wat baselined<br />

is sinds de <strong>voor</strong>gaande synchronisatie. Deze work-items worden gesplitst in drie lijsten:<br />

● één <strong>voor</strong> de over te nemen work-items. (hiervan worden sibling work-items gemaakt)<br />

● één <strong>voor</strong> de niet over te nemen items. (hiervan worden undo envelopes gemaakt <strong>voor</strong> de<br />

merge-import-drawer)<br />

● één <strong>voor</strong> de reeds gerealiseerde work-items, waar<strong>voor</strong> reeds siblings bestaan. (hiervan<br />

worden undo envelopes gemaakt <strong>voor</strong> de merge-import-drawer)<br />

Alle undo envelopes zijn comrades die refereren aan het adopt work-item.<br />

De composite activity bestaat uit:<br />

● Als we veronderstellen dat het snapshot met originals reeds aanwezig is in de betreffende<br />

merge-import-drawer: exact copy van het snapshot met potentiële neighbors. Dit wordt het<br />

snapshot met originals <strong>voor</strong> de volgende keer. De copy plaatst de tip (of een baseline) van<br />

de export-drawer van het sister-project in de merge-import-drawer.<br />

● We realiseren de undo envelopes in de merge-import-drawer. De nieuwe tip van de mergeimport-drawer<br />

bevat de uiteindelijke neighbors.<br />

● We realiseren een globale merge via een satellite in de team-drawer. Dit gebeurt op de<br />

gebruikelijke manier: eerst nemen we de tip-tag van de team-drawer als base, dan vinden<br />

builds, tests en plaats, en worden verbeteringen aangebracht, en tenslotte wordt het resultaat<br />

gebaseerd op de tip van de transfer-drawer, en overgedragen.<br />

● Dit vindt plaats onder toezicht van de composite activity van een “adopt” work-item dat de<br />

gehele synchronisatie begeleid. Als dit work-item de melding implemented ontvangt<br />

worden ook de sibling work-items op implemented gezet.<br />

3. Adopt en undo operaties tijdens groeps-operaties.<br />

Er kunnen work-items zijn die zelf niet refereren aan een envelope, bij<strong>voor</strong>beeld omdat ze met een<br />

groeps-operatie (merge vanuit een ander project) zijn geïmplementeerd. Deze work-items zijn<br />

siblings van andere work-items die mogelijk wel een envelope hebben, of die zelf weer<br />

geïmplementeerd zijn met een groeps-operatie, enzo<strong>voor</strong>t. Via work-item siblings is er altijd wel<br />

één te vinden met een envelope, of een set envelopes (envelope comrades en envelope successors).<br />

Van die work-item siblings die met envelope zijn implemented kan er één gekozen worden <strong>voor</strong> de<br />

adopt of undo operatie. Misschien kan een script de meest geschikte kandidaat vinden, maar<br />

<strong>voor</strong>lopig ga ik er maar vanuit dat je er een mens <strong>voor</strong> nodig hebt.<br />

4. In plaats van adopt merge werken met een zwerm adopt envelopes<br />

Deze methode is aan te bevelen indien er veel wederzijdse uitwisseling bestaat. Immers tussen<br />

originals en neighbors zijn veel gemeenschappelijke wijzigingen gerealiseerd in beide subprojects.<br />

Die wijzigingen hoef je niet meer over te nemen. Ook kunnen er veel wijzigingen zijn gerealiseerd<br />

in het andere subproject die je niet wilt overnemen. Kortom als het aantal “undo” envelopes<br />

aanzienlijk wordt, dan is de zwerm zeker aan te bevelen.<br />

● Er vinden selecties plaats op de work-items in het andere subproject om een lijstje work-<br />

Pagina: 135 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.5 Planning & Tracking en Repositories<br />

items te krijgen waarvan de siblings in het eigen project moeten worden gemaakt.<br />

● Het lijstje work-items wordt gebruikt om die envelopes te vinden waaruit adopt envelopes<br />

moeten worden gemaakt.<br />

● Een script maakt de sibling work-items in het eigen package, en de envelopes <strong>voor</strong> de<br />

betreffende merge-import-drawer.<br />

● Met exact copy wordt het snapshot base versions binnen gehaald in de merge-importdrawer.<br />

Dit is de tip van de eigen team-drawer.<br />

● De adopt envelopes worden hierop gerealiseerd, (met behulp van een satellite van de<br />

merge-import-drawer). Eventuele aanvullende wijzigingen worden gerealiseerd. In dit<br />

drawer en zijn envelopes zijn alle details terug te vinden.<br />

Een verschil met adopt merge, <strong>voor</strong> zover het de groep activity betreft:<br />

● Een merge vindt plaats naar een satellite van de team-drawer, op de gebruikelijke wijze<br />

zodat daar een ingedikte overname plaatsvindt, zoals bij adopt merge. Hier wordt ook een<br />

overgang gerealiseerd: eerst was een tip-tag van de team-drawer de base, nu kan men de<br />

wijzigingen baseren op de tip van de transfer-drawer.<br />

● Adopt zwerm: Het work-item <strong>voor</strong> de merge refereert aan de envelope in de team-drawer<br />

waarmee de merge wordt gerealiseerd, maar alle siblings bevatten een envelope waarmee<br />

de individuele implementatie in de merge-import-drawer is gerealiseerd.<br />

Adopt merge: Het work-item refereert aan alle envelopes: de undo envelopes en de merge<br />

envelope. De sibling work-items bevatten geen envelope referentie.<br />

De zwerm heeft als <strong>voor</strong>deel dat alle wijzigingen gerelateerd zijn aan envelopes in de sibling workitems,<br />

ook eventuele aanvullende wijzigingen die <strong>voor</strong>tkomen uit build en test resultaten. Dit maakt<br />

de zwerm aantrekkelijk ten opzichte van de adopt merge met undo.<br />

Pagina: 136 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

2.6 Builds en Repositories<br />

2.6.1 De invloed van builds op <strong>Climbexion</strong><br />

Het build proces gebaseerd op recent timestamp.<br />

Normaal wordt een build uitgevoerd door een build programma aan de hand van een scrip file. De<br />

uitvoering bestaat uit twee delen. Deel 1 creëert een directed graph en deel 2 gebruikt de graph <strong>voor</strong><br />

generen, compileren en linken. Deze 2 fasen methode is de way of working als je Koala gebruikt.<br />

In wezen is de graph een data flow diagram. In wezen is de graph een workflow diagram. Minstens<br />

één van beide zal wel waar zijn.<br />

De graph bestaat uit 2 soorten nodes, file nodes en script nodes. File nodes bevatten een verwijzing<br />

naar een file, en script nodes bevatten een script.<br />

Zo'n script beschrijft meestal een compilatie en roept een compiler aan, of het is een link<br />

procedure,en roept een linker aan, maar in zijn algemeenheid kan het ook een programma of een<br />

script aanroepen dat compileerbare code genereert uit plaatjes of specificaties.<br />

Een script node heeft een aantal input nodes, dit zijn altijd file nodes. In de graph zijn het de directe<br />

<strong>voor</strong>gangers van het script. Ze worden wel de “dependency list” van de scrip node genoemd. Een<br />

script node heeft ook één of meer output nodes, dit zijn ook altijd file nodes, en ze volgen<br />

rechtstreeks op de script node. Alleen die outputs van een script worden opgenomen in de graph die<br />

nodig zijn om de end-node te bereiken, maar eventuele andere output files van het programma dat<br />

door de script node wordt aangeroepen worden wél gegenereerd als het script wordt uitgevoerd.<br />

Een graph bevat een aantal begin-nodes, en één end-nodes. Begin-nodes zijn file nodes. De endnode<br />

is een file node die gewoonlijk een fictief target representeert. Als een build wordt uitgevoerd<br />

wordt één file node aangewezen als target. Bij dit target hoort een subgraph naar de “reachable”<br />

begin-nodes. Deze subgraph wordt gebruikt om het target up-to-date te maken. Targets zijn meestal<br />

executables of libraries. Het target is de end-node van de subgraph. Over het algemeen wordt in fase<br />

1 slechts de subgraph aangemaakt.<br />

Een output file die gegenereerd wordt heet ook wel een “derived file”, en een file die in begin nodes<br />

<strong>voor</strong>komt wordt “source file” genoemd. Een output file die geen target is wordt wel “intermediate<br />

result file” genoemd.<br />

Een output file wordt altijd maar op één manier gemaakt. Daarom kan een script node, – indien<br />

nodig, – een unieke naam krijgen als hij wordt genoemd naar de file van de eerste output node.<br />

Vaak heeft één van de input files dezelfde naam als de output file (op een type aanduiding na). Deze<br />

file noemen we de primary input. Wie de andere input files zijn is dan vaak af te leiden uit de<br />

content van de primary input file en de content van reeds gevonden input files.<br />

Deel 1 formeert in het algemeen de graph, aan de hand van een script file, parameters, en de<br />

bevindingen in het file system. Het is niet eenvoudig om de graph zo precies mogelijk te maken. Als<br />

een script node meer inputs nodes heeft dan er werkelijk gebruikt worden tijdens uitvoering van het<br />

script, dan gaat dit ten koste van de efficiëntie van het build process. Als er minder input nodes zijn<br />

Pagina: 137 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

dan er gebruikt worden dan kan het build process een foute target genereren. Bij<strong>voor</strong>beeld: de build<br />

kan mislukken omdat de linker een oude object file gebruikt, met verouderde referenties, en zonder<br />

de nieuwe symbolen.<br />

● Er zijn ontwikkelomgevingen waarin de graph handmatig wordt bijgehouden in een make<br />

file.<br />

● Moderne IDE's houden een project-file bij, waarin alle source files staan, en met de<br />

aanname dat elke object file afhangt van een gelijknamige primaire source file en van alle<br />

header files, en dat de target afhangt van alle object-files, wordt hieruit de graph gemaakt.<br />

● De graph kan echter ook (deels) geconstrueerd worden door tools die de structuur van de<br />

graph vaststellen, door te kijken wat er in de source en header files staat. De Cpp<br />

preprocessor heeft bij<strong>voor</strong>beeld een optie om een dependency list te genereren door na te<br />

gaan welke header files worden gebruikt in een C of C++ programma en hun header files.<br />

● Voor NXP Mips software is er het Koala gereedschap dat wordt gebruikt om vast te stellen<br />

welke object files nodig zijn <strong>voor</strong> een target. Koala bepaalt dit aan de hand van de koala<br />

files. In feite kijkt koala welke Koala files gewijzigd zijn ten opzichte van de vorige keer, en<br />

wijzigt zo de tree van de vorige keer.<br />

Pagina: 138 / 230<br />

buildgraph


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Hoe dan ook, de build scripts zijn vaak complex en net zo "under construction" als de software zelf,<br />

dus lang niet altijd volmaakt.<br />

Deel 2 voert script nodes in de subgraph uit.<br />

● Een node wordt uitgevoerd omdat één van de output files ontbreekt. Er is wel een output<br />

node maar de genoemde file staat niet in het file system. Na uitvoering van het script is de<br />

file er wel.<br />

● Een node wordt ook uitgevoerd als de timestamp van één van de input files recenter is dan<br />

die van één van de output files. Na afloop van het script hebben alle output files van de node<br />

een recentere timestamp dan de input files.<br />

● Een node mag pas worden uitgevoerd, als die script nodes zijn uitgeprobeerd, en mogelijk<br />

ook zijn uitgevoerd, die een input file leveren <strong>voor</strong> de node.<br />

● Er worden net zo lang script nodes uitgevoerd tot er geen aanleiding meer is: alle output<br />

files van elke node in de subgraph zijn er en ze zijn allemaal recenter dan de betreffende<br />

input files.<br />

In plaats van te zeggen: “de node wordt uitgevoerd”, of “het script van de node wordt uitgevoerd”<br />

zegt men ook wel: “de node vuurt” of “het script wordt afgevuurd” of “de node vuurt het script af”.<br />

Als deel 2 afgebroken wordt, bij<strong>voor</strong>beeld doordat een compilatie mislukt en een error code afgeeft,<br />

en je verbetert de fout, dan gaat deel 2 van een nieuwe build verder waar de oude is gebleven.<br />

Het is altijd mogelijk om een volledige build uit te voeren <strong>voor</strong> een gekozen target. Dit werkt als<br />

volgt:<br />

● iedere node in de subgraph moet eenmaal vuren.<br />

● Een node gaat vuren als geen van zijn input files wordt gegenereerd door een andere node<br />

het zijn allemaal source files.<br />

● Een node gaat ook vuren als alle script nodes hebben gevuurd, die één van zijn input files<br />

genereren.<br />

Dit is nodig als het geheel aan source files en intermediate result files is gecorrumpeerd,<br />

bij<strong>voor</strong>beeld omdat de timestamps niet kloppen, of omdat een fout verlopen generator wel een foute<br />

output file heeft gemaakt. Ook na wijziging van het build process, of van de tools die erin gebruikt<br />

worden is het raadzaam om een volledige build uit te voeren. De verzameling derived files kan<br />

gemanipuleerd worden buiten de build procedure om, dat kan corruptie veroorzaken, waarna een<br />

clean build nodig is.<br />

Het is aan de gebruiker om vast te stellen of een volledige build nodig is. Een indicatie is<br />

bij<strong>voor</strong>beeld dat een gewone build mislukt, of dat de binary zich onverwacht gedraagt. Maar als de<br />

volledige build dan ook mislukt, of als de binary zich nog steeds onverwacht gedraagt dan lag het<br />

mogelijk niet aan de build.<br />

Een zwak punt :<br />

Als er oudere source files opduiken in de working-tree dan die van derived files in de vorige<br />

build, dan is dat bij een nieuwe build geen aanleiding om een node af te vuren. Hier is de<br />

werking van het <strong>revision</strong> <strong>control</strong> system in het geding.<br />

Een working-tree synchroniseren levert vaak recentere timestamps op van gewijzigde files en<br />

altijd dezelfde timestamps <strong>voor</strong> ongewijzigde files. Maar het kan <strong>voor</strong>komen dat wijzigingen in<br />

de working-tree worden tenietgedaan door synchroniseren, dan is de timestamp van een<br />

gewijzigde file niet per se recenter dan die van de vervangen file. We specificeren een optie die<br />

<strong>Climbexion</strong> laat werken op de volgende manier:<br />

Pagina: 139 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

● De timestamp wordt geleverd door het tip event van de course van de file.<br />

● Wanneer de working-tree wordt gesynchroniseerd met de drawer dan kan de repository<br />

software aan de course van een element het event toevoegen dat het element is<br />

gekopieerd naar de working-tree Dit is het touch event. Dit event heeft een jongere<br />

timestamp dan de <strong>voor</strong>gaande build, en is gelijk aan de timestamp van de working-tree<br />

file na synchronisatie. Het <strong>revision</strong> <strong>control</strong> system is dan nog steeds in staat om te<br />

<strong>control</strong>eren of kopiëren nodig is, ingeval van exact copy.<br />

Deze optie van het <strong>revision</strong> <strong>control</strong> system is er speciaal <strong>voor</strong> builds die gebaseerd zijn op recent<br />

timestamp.<br />

Een bekend <strong>voor</strong>beeld van een make programma gebaseerd op recent timestamps: GNU Make.<br />

Een programma dat Koala lijkt te evenaren als het gaat om builds over een complexe folder<br />

structuur, en het scheiden van sources en derived files: Cmake.<br />

De opslag van tussenresultaten:<br />

● Elke target heeft een eigen folder <strong>voor</strong> de derived files: de build folder. Een product target<br />

heeft andere derived files dan een platform target, (dank zij o.m. de compile time interface<br />

binding van KOALA, die header files genereert <strong>voor</strong> elke c source file: een gecompileerde<br />

file <strong>voor</strong> een product verschilt daardoor van die <strong>voor</strong> een platform) de object modules in<br />

debug mode verschillen van die in optimize mode, dus <strong>voor</strong> één target kan er een folder zijn<br />

<strong>voor</strong> debug, en één <strong>voor</strong> optimize.<br />

● De .h files en c files die gegenereerd worden door de idl compiler zijn altijd hetzelfde, of ze<br />

nu in een platform build worden gebruikt, of in een product build, of in een component<br />

build. In debug mode of in optimize mode, ze zijn hetzelfde. Hier<strong>voor</strong> wordt dan ook een<br />

aparte folder gebruikt, zodat de ene build kan profiteren van de tussenresultaten van de<br />

andere.<br />

Binnen de inner-reach van zo'n build folder vindt je vaak een folder structuur <strong>voor</strong> de nette opslag<br />

van intermediate result files.<br />

De targets zelf komen als member terecht in de build folder. Deze target wordt mogelijk gekopieerd<br />

in de inner-reach van een package, bij<strong>voor</strong>beeld om met het package gedistribueerd te worden.<br />

Het build proces gebaseerd op different timestamp.<br />

De studie hier is om te kijken of de build folder kan worden opgeslagen in de team-drawer na de<br />

acceptatie test. Als een satellite wordt gesynchroniseerd, dan wordt ook de meest recente build<br />

folder van de daily build beschikbaar gesteld en hoeven alleen de eigen wijzigingen te worden<br />

gecompileerd.<br />

● Een inner-reach van een build folder <strong>voor</strong> de derived files van de daily builds is <strong>voor</strong>lopig<br />

één enkel element in het <strong>revision</strong> <strong>control</strong> system, dat wil zeggen een archief (zip, tar) file<br />

van zo'n folder is een element in het <strong>revision</strong> <strong>control</strong> system.<br />

● De vraag is nu hoe de build procedure moet worden aangepast om builds in working-trees of<br />

info-trees goed te laten verlopen:<br />

Het build process moet niet langer testen of de timestamp van de file in een output node<br />

minder recent is dan dat van één van de input nodes, maar of de timestamp van de input<br />

node afwijkt van die van de vorige keer. Dit kan door de graph op te slaan met de<br />

timestamps van de betrokken files. De timestamps worden opgeslagen op de input edges van<br />

Pagina: 140 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

de script nodes, en up-to-date gebracht nadat het vuren van de script node goed is verlopen.<br />

● Als een file uit het <strong>revision</strong> <strong>control</strong> system wordt geplaatst in een working-tree of info-tree,<br />

dan moet de timestamp niet de timestamp zijn van het tip event in de betrokken drawer,<br />

maar de timestamp van de version. Deze timestamp is de “datum laatste wijziging” van de<br />

file ten tijde van de commit. Deze optie van het <strong>revision</strong> <strong>control</strong> system is speciaal <strong>voor</strong><br />

builds die gebaseerd zijn op different timestamp. De optie is een een waarde van een<br />

attribute van de drawer.<br />

De builds <strong>voor</strong> platform of andere onderdelen en <strong>voor</strong> het product worden hierdoor mogelijk minder<br />

langdurend. In plaats van een clean build kun je dan de build folder uit het <strong>revision</strong> <strong>control</strong> system<br />

halen, en profiteren van de resultaten die daar reeds behaald zijn. Dit build process is mogelijk<br />

kwetsbaarder <strong>voor</strong> corruptie dan een build gebaseerd op recent timestamp, omdat de graph met<br />

timestamps permanent moet worden opgeslagen, ook nadat er een (compilatie) fout is opgetreden.<br />

Pagina: 141 / 230<br />

Edges van Begin Nodes met Timestamps


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

In feite gaat het om de betrouwbaarheid van een permanente gegevensbank: die kan gaan afwijken<br />

van de werkelijkheid. Deze kwetsbaarheid is reeds begonnen bij Koala, die gebruik maakt van een<br />

<strong>voor</strong>gaande data om de huidige data bij te werken, en de buildgraph te creëren.<br />

Meer dan bij een recent timestamp methode geldt in zijn algemeenheid:<br />

● Kies een gerenommeerd build tool.<br />

● Kies gerenommeerde compilers, linkers, generators en <strong>voor</strong>al betrouwbare tools om delen<br />

van de buildgraph te af te leiden.<br />

● Zorg <strong>voor</strong> een adequate discipline om de eigen scripts en tools bij te houden.<br />

● Zorg <strong>voor</strong> een adequate omgeving en discipline om de builds uit te voeren.<br />

● Zorg regelmatig <strong>voor</strong> clean builds. Bij<strong>voor</strong>beeld de dagelijkse builds in de team-drawer<br />

zouden clean builds kunnen zijn: hierbij kan de buildgraph opnieuw gemaakt worden.<br />

In feite is het <strong>voor</strong> deze timestamp methode niet per se nodig om de gehele graph op te slaan. Een<br />

graph bestaat uit nodes en edges. De edges vanaf een source node naar een script node zijn van<br />

belang. Voor elk van deze edges moet de timestamp van de source bewaard worden. Dit is<br />

natuurlijk minder robuust, dan een methode die alles opslaat. Het make algoritme werkt nu als<br />

volgt.<br />

● Een script node mag pas vuren als al zijn <strong>voor</strong>gangers zijn geprobeerd, en mogelijk hebben<br />

gevuurd.<br />

● Als de file van een output node ontbreekt dan kan gevuurd worden.<br />

● Als de file van een output node minder recent is dan die van een intermediate result input<br />

node, dan kan gevuurd worden.<br />

● Als de timestamp van een file van een source input node afwijkt van de timestamp op de<br />

edge, dan kan gevuurd worden. Ook als er geen timestamp bekend is van een vorige build,<br />

kan gevuurd worden. Als het vuren zonder fouten afloopt wordt de edge up-to-date gebracht,<br />

met de timestamp van de source.<br />

Voorbeelden van make programma's gebaseerd op different timestamp: “Alcatel-Lucent Nmake”<br />

(http://www.bell-labs.com/project/nmake/ ) free software: Odin (http://sourceforge.net/projects/odinbuild/)<br />

In plaats van een timestamp wordt ook wel gesteld dat je beter een content hash kunt gebruiken.<br />

<strong>Climbexion</strong> versions krijgen als interne identifier waarschijnlijk een door <strong>Climbexion</strong> gegenereerde<br />

content hash. Deze zou als metadata in een working-tree file kunnen worden geplaatst. Het best zou<br />

de hash door het edit tool kunnen worden gegenereerd bij een "save" opdracht, en berekend kunnen<br />

worden <strong>voor</strong> gegenereerde files, zodra die ontstaan: dus <strong>voor</strong>dat een commit plaatsvindt.<br />

Samenvatting recent en different timestamp builds<br />

<strong>Climbexion</strong> heeft 2 opties:<br />

● Voor recent timestamp builds: Een working-tree element krijgt als “datum laatste wijziging”<br />

de timestamp van het laatste event in de course. Als een working-tree file opnieuw wordt<br />

gesynchroniseerd met de satellite (exact copy) dan wordt dit als event (touch event)<br />

geplaatst in de course van de gekopieerde file. De working-tree file krijgt de timestamp van<br />

dit laatste event.<br />

● Voor different timestamp builds: Een working-tree file krijgt de timestamp van de version<br />

(de datum laatste wijziging) of anders diens content hash. Elements zonder versions<br />

(folders) krijgen de geboorte timestamp van de kin, of de kin id in plaats van de hash.<br />

Pagina: 142 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Soortgelijke opties vond ik bij Synergy.<br />

Het build proces zonder timestamp of checksum, gewoon <strong>voor</strong> de lol.<br />

De methode die ik nu beschrijf is van origine een “push” algoritme. Dit wil zeggen dat een update<br />

wordt gepropageerd naar alle targets. Een <strong>voor</strong>waarde is dat er een taak (ihook) is opgestart die in<br />

actie komt zodra een (gewijzigde) file in de working-tree terechtkomt, een hook van de “file close”<br />

procedure zeg maar. Ik weet niet of er build tools bestaan die zijn gebaseerd op dit principe, in mijn<br />

jeugd heb ik mij hieraan bezondigd <strong>voor</strong> een software transitie van de afdeling ontwikkeling naar<br />

de afdeling productie. Mijn amateuristische implementatie was echter niet robuust en niet<br />

herstartbaar na een compilatiefout, en de methode is een stille dood gestorven.<br />

In de praktijk kan een wijziging van een source leiden tot een wijziging in de structuur van de<br />

buildgraph. De beschrijving van het algoritme houd ik hier eenvoudig door uit te gaan van een<br />

ongewijzigde opgeslagen buildgraph:<br />

De script nodes in de buildgraph worden genummerd zodanig dat een node X waarvan een<br />

output file input is <strong>voor</strong> een node Y een lager nummer krijgt dan node Y. Naast de<br />

buildgraph wordt er een heap bijgehouden. De taak ihook plaatst node nummers in de<br />

heap. Voor elke (gewijzigde) file die de working-tree binnenkomt wordt uitgezocht <strong>voor</strong><br />

welke script nodes de file een input file is, en die node nummers worden door ihook in de<br />

heap geplaatst. Een build procedure haalt steeds de laagst genummerde node volledig uit de<br />

heap en voert die uit. Dit resulteert in nieuw gewijzigde files in de working-tree, zodat ihook<br />

weer (met prioriteit) in actie komt en de heap uitbreidt.<br />

Een en ander maakt dat het algoritme <strong>voor</strong>namelijk geschikt kan zijn <strong>voor</strong> build managers. Een<br />

drawer <strong>voor</strong> een build manager staat bij<strong>voor</strong>beeld open <strong>voor</strong> overdrachten van ontwikkelaars (met<br />

een overdrachtstool), en periodiek wordt de drawer gesloten en vindt de build plaats (met een build<br />

tool). Het algoritme zou in die situatie simpel geïmplementeerd kunnen worden, want ihook is<br />

eenvoudig te implementeren als een procedure in beide tools. Over het algemeen is het de vraag of<br />

er een ihook gemaakt kan worden die altijd en overal werkt, en je wilt de situatie vermijden dat er<br />

met veel regels en beperkingen gewaarborgd moet worden dat ihook werkt.<br />

Helaas is het niet praktisch als de build manager andere tools hanteert <strong>voor</strong> de build dan de<br />

ontwikkelaars.<br />

Eigenlijk kan het principe worden toegepast zonder heap, op zo'n manier dat file-to-script edges in<br />

de buildgraph gemarkeerd worden door ihook. Er zouden daarna “pull” algoritmen gebruikt<br />

kunnen worden. Merk op dat ihook kan markeren buiten de subgraph die bij een pull methode<br />

gebruikt wordt, ook als ze door het pull algoritme aan het werk gezet wordt.<br />

Bij de “different timestamp” methode kan eerst de structuur van de buildgraph worden bijgewerkt<br />

in de “deel 1” fase van de build. Daarna tijdens deel 2 van de build fase worden nieuwe<br />

timestamps opgeslagen. Maar bij deze ihook methode moet de buildgraph in deel 1 niet alleen<br />

bijgewerkt worden maar ook nog gemarkeerd worden door ihook. Het weghalen van een markering<br />

vindt in het build proces plaats meteen nadat de node met succes heeft gevuurd in deel 2.<br />

De kwetsbaarheid van ihook komt bovenop de kwetsbaarheid die reeds gold <strong>voor</strong> de “different<br />

Pagina: 143 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

timestamp” methode: de permanente opslag van de buildgraph die altijd een getrouwe<br />

administratie moet zijn van de werkelijkheid. Als er iets mis gaat is de graph opnieuw af te leiden<br />

uit de werkelijkheid, maar opgeslagen timestamps en markeringen niet. Een verschil tussen een<br />

timestamp in een input edge en een markering van een input edge: als de timestamp niet is ingevuld<br />

dan is dat een reden om de script node te laten vuren, als een markering niet is ingevuld, dan is dat<br />

geen reden om de node te laten vuren.<br />

Eigenlijk is de timestamp (of hash) van een file in een gebruikelijk file<br />

system geen unieke identificatie van de versie van een file: theoretisch is het mogelijk dat een<br />

andere versie van een file de working-tree binnenkomt die dezelfde timestamp (of hash) heeft als<br />

zijn <strong>voor</strong>ganger. Wat dat betreft is deze ihook methode uitstekend en theoretisch volmaakt. Aan de<br />

andere kant als een bestaande file <strong>voor</strong> de tweede keer de tree binnenkomt, dan is een markeer<br />

reactie overbodig, en zou die onderdrukt moeten worden, en dat vermogen heeft mijn methode niet.<br />

De buildgraph lijkt wel wat op een petri-net, maar er zijn typische verschillen, Zo bevinden zich de<br />

tokens bij de buildgraph op de arcs van file-nodes naar script nodes (input arcs). Een script node<br />

(transitie) mag vuren als minstens één input arc een token bevat of als een output file ontbreekt. Als<br />

een token geplaatst wordt op een arc, dan verenigt deze zich met een eventueel reeds aanwezig<br />

token. In een petri-net bevinden de tokens zich in places, moeten alle input places een token<br />

bevatten <strong>voor</strong>dat een transitie mag vuren, en verenigen tokens zich niet. Een script node in een<br />

buildgraph vuurt pas als er geen verdere plaatsing van tokens wordt verwacht op de input arcs, er<br />

is sprake van een gedwongen volgorde, in tegenstelling tot het non determinisme van petri-nets.<br />

Ik vermoed dat een buildgraph vertaald kan worden in een petri-net, maar wel één met de nodige<br />

extensies waardoor er weinig toegevoegde waarde is: het petri-net is waarschijnlijk niet beter<br />

analyseerbaar en verifieerbaar, dan de buildgraph. Het zou misschien belangrijk kunnen zijn <strong>voor</strong><br />

de taxonomie: make of build software is een vorm van workflow software.<br />

2.6.2 First class citizens of tarballs<br />

Ik ga er tot nu toe vanuit dat <strong>voor</strong> <strong>Climbexion</strong> een build folder een file element is, een tarball of een<br />

zip file. In principe betekent dit dat grote hoeveelheden content worden getransporteerd en<br />

opgeslagen. Als je aanneemt dat het <strong>voor</strong>al clean builds (builds vanaf scratch) zijn die worden<br />

opgeslagen dan is dit mogelijk gerechtvaardigd. Het element-type "gearchiveerde folder" kan<br />

geïntroduceerd worden <strong>voor</strong> het opslaan van folder-structuren met derived files.<br />

Als je twee keer dezelfde source file compileert en je vergelijkt de content van de twee object files,<br />

dan blijken die soms te verschillen. Dit komt omdat in een aantal formaten van object files de<br />

compilatie timestamp of link timestamp deel uitmaakt van de inhoud van de files, en er niet slechts<br />

als metadata bij de file-id of in een file fork aan is toegevoegd. De content in een intermediate result<br />

file of in een target zal daarom verschillen van die van een <strong>voor</strong>ganger als hij opnieuw gemaakt<br />

wordt. Er zijn waarschijnlijk nog andere oorzaken waardoor twee compilaties van precies dezelfde<br />

sources kunnen verschillen. Met simpele compare tools en checksum of hash tools herken je zo<br />

geen files die eigenlijk hetzelfde zijn.<br />

Enige mogelijke bijkomende oorzaken:<br />

● Niet geïnitialiseerd data geheugen, niet geïnitialiseerde gaps.<br />

Pagina: 144 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

● Non determinisme (bij<strong>voor</strong>beeld door het gebruik van threads tijdens compileren),<br />

● Linkers en library tools zijn vaak in staat om incrementeel object files te incorporeren in<br />

executables en libraries. Ook vervangen en verwijderen van objecten is mogelijk. Je kunt<br />

verwachten dat het adres van de geheugen allocatie van een object binnen de executables of<br />

libraries afhangt van de volgorde waarin de mutaties zich aandienen. Dit geldt in ieder geval<br />

<strong>voor</strong> sommige van deze tools.<br />

● Er zijn C macro's als “__DATE__” en “__TIME__”. De datum en tijd zouden slechts dan in<br />

de content van een object file mogen worden opgenomen als deze macro's daadwerkelijk<br />

gebruikt worden.<br />

● zelflerende compilers. ;-)<br />

Ik heb niet de indruk dat ik de volgende vraag volledig en uitputtend behandeld heb: wanneer kun je<br />

niet met een simpel compare tool of met een hash bepalen of twee derived files hetzelfde zijn.<br />

Mogelijk is een test of het wel of niet kan erg simpel.<br />

Misschien is mijn scepsis gebaseerd op spoken uit een ver verleden, en komen dit soort problemen<br />

momenteel helemaal niet <strong>voor</strong>. Toen ik in Wikipedia een vergelijking vond van formaten van object<br />

files, was er sprake van de mogelijkheid om metadata op te slaan in de content. Maar misschien<br />

wordt hiermee debug informatie bedoeld, zoals line numbers, en non external symbols.<br />

Gebruik je een object file formaat waarin geen metadata wordt opgeslagen in content, en een<br />

compiler / linker die de hele content initialiseert enzo<strong>voor</strong>t, dan kan <strong>Climbexion</strong> met een simpel tool<br />

herkennen dat object files hetzelfde zijn, en is het efficiënt om geen tarball te gebruiken maar om<br />

individuele versions te vervangen en te transporteren, zelfs bij builds vanaf scratch. Als er sprake is<br />

van non determinisme, dan kan in de praktijk gelden dat er een reële kans is dat een object file in<br />

twee opeenvolgende builds op dezelfde PC gelijk zijn. Als je werkt met verschillende typen derived<br />

files, dan zijn sommige typen vast wel exact reconstrueerbaar. Misschien geldt dan: neem die kans<br />

en werk met first-class-citizens.<br />

Het gebruik van build procedures gebaseerd op “recent timestamp” is een belangrijke reden om<br />

regelmatig clean builds uit te voren, maar ik ben er van overtuigd dat het niet de enige reden is.<br />

Soms is een clean build aan te bevelen als source files verplaatst of hernoemd zijn, want een build<br />

tool kent gewoonlijk geen kin, en zou ten onrechte een verweesde derived file kunnen tolereren als<br />

een source file. Een build manager die bouwt <strong>voor</strong> een wijzigend team zal alleen al daarom <strong>voor</strong> de<br />

zekerheid regelmatig clean builds uitvoeren, liever dan nauwkeurig na te gaan wat er precies<br />

gewijzigd is en dan manueel te zorgen <strong>voor</strong> precies de juiste rebuild. Maar misschien is zijn er<br />

inmiddels goede tools, immers een source file hoort niet <strong>voor</strong> te komen in een folder <strong>voor</strong> derived<br />

files; een goed tool weet dat en verwijdert een verweesde file, en <strong>Climbexion</strong> hoort dit ook te weten<br />

en vult een nihil file in in de filestring, of wijzigt name en folder reference in de file-string<br />

reference. Uiteindelijk zou een clean build slechts nodig zijn bij een wijziging van de build<br />

software, of corruptie of verlies van de build database waarin de identifiers van de oorspronkelijke<br />

versions zijn opgeslagen. Misschien is een clean build nodig bij corruptie of verlies van build<br />

folders, maar een goed tool herkent mogelijk de corruptie en verwijdert derived files die afwijken<br />

van de build database, <strong>voor</strong>dat de build start.<br />

Nu we kunnen besluiten om build results niet op te slaan als archive, moeten we maar een kijken<br />

naar de gegenereerde folders, zijn dat other-focused folders? Een folder is in <strong>Climbexion</strong><br />

gedefinieerd als een element zonder inhoud, waarnaar andere elementen mogen wijzen. Zo'n folder<br />

slaat echt niet op een snapshot, maar is een gewone folder, met hooguit een entity type “build<br />

Pagina: 145 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

container”. Af en toe moet maar eens gekeken worden, of zo'n folder beëindigd moet worden.<br />

2.6.3 Build Forest<br />

Deze trend in de ontwikkeling definieert een working-tree, of een info-tree als een verzameling<br />

build trees, die min of meer onafhankelijk van elkaar builds kunnen uitvoeren. Zo'n build tree<br />

bestaat dan uit packages. Een executable (binary) die gemaakt wordt in de ene build tree moet<br />

kunnen samenwerken met die uit een andere als ze worden uitgevoerd in de televisie. Dit<br />

samenwerken kenden we reeds: een TriMedia binary moet samenwerken met een MIPS binary en<br />

met een 8051 binary, maar nu krijgt elke binary een eigen subtree, en er komen meerdere binaries<br />

<strong>voor</strong> de MIPS processor. Sommige van mijn collega's zijn bezorgd en spreken over het naderen van<br />

de “dependency hell”, waarmee ze runtime afhankelijkheden aanduiden. Mijns inziens wordt de hell<br />

pas bereikt als independent deployment wordt bereikt, en <strong>voor</strong>lopig zal ik het geen hell noemen<br />

maar een uitdaging.<br />

Om op runtime te kunnen communiceren worden interface gegevens, en referentie codes van<br />

servers mee gecompileerd en gelinkt met clients. De betreffende files worden gedefinieerd in een<br />

package van de ene tree, of in een package in de andere, of zelfs in een derde tree. De methode die<br />

gebruikt wordt is hetzelfde of is afgeleid van de COM methode van Microsoft. Dit houdt in dat een<br />

midl compiler wordt gebruikt in een build.<br />

Een package bevat 2 soorten shared data:<br />

● public binnen de build tree (local public).<br />

● public binnen het build forest (global public).<br />

In een local public folder structuur worden <strong>voor</strong>namelijk koala interface files en koala data definitie<br />

files, en public koala componenten beschikbaar gesteld, en in een global public folder (gpf)<br />

structuur een mix van sources en derived files. Er kunnen mogelijk koala interfaces in staan maar<br />

zeker ook COM en idl elementen. Bij derived files in een global public folder moet men denken aan<br />

gegenereerde proxy/stub/guid source modules, en gegenereerde header files. Zo'n global public<br />

folder moet ook gebruikt worden buiten de build tree waarin hij staat, er zijn dan ook verwijzingen<br />

vanuit andere build trees naar de global public folder.<br />

Voor <strong>Climbexion</strong> betekent dit dat er een element bijkomt: de soft-link van een build tree naar een<br />

Pagina: 146 / 230<br />

Build forest


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

global public folder in een andere build tree. Strikt genomen is dit niet nodig omdat de koala pd<br />

files zo'n tree kunnen definiëren. Maar ik zag dat ze hier<strong>voor</strong> Windows shortcuts te gebruiken.<br />

Er zijn twee smaken: de soft-link naar een folder binnen het package, en de soft-link naar een folder<br />

in een ander package. Het tweede type hoeft niet per se opgelost te worden. Net als package<br />

references trouwens. In export en import drawers komt immers geen volledige tree <strong>voor</strong>.<br />

Het gebruik van import limitations op satellites en info-trees kan gebruikt worden om een aantal<br />

build trees te trimmen zodat daarin alleen de global public folders en de executables beschikbaar<br />

worden gesteld. De subtrees met eigen packages bevatten natuurlijk wel alle sources, om de eigen<br />

executable te maken. Om dergelijke import limitations te kunnen gebruiken zal de executable, de<br />

target van de build waarschijnlijk gescheiden van de intermediate result files en de buildgraph<br />

worden bewaard.<br />

Normaal mag een team slechts eigen packages wijzigen. Packages van andere teams worden<br />

normaal alleen gewijzigd met patches. (je kunt wel files wijzigen in info-trees en working-trees, en<br />

misschien satellites maar niet en in de center-drawer, want de version pool is read-only <strong>voor</strong><br />

normale transfers). Nu <strong>Climbexion</strong> faciliteiten biedt om build resultaten op te slaan wil je dat niet<br />

prijsgeven als het build forest geïntroduceerd wordt. Maar als build folders verspreid in packages<br />

staan, dan zou hun inhoud ook gewijzigd moeten kunnen worden door andere teams, bij<strong>voor</strong>beeld<br />

tijdens hun dagelijkse build, bij<strong>voor</strong>beeld als de build een “clean build” is, waarbij h files proxies,<br />

stubs en guids c files worden gegenereerd. Dus deze derived elements mogen vrij worden<br />

gewijzigd. Deze files zullen daarom misschien in een andere pool, met andere access rechten<br />

moeten komen.<br />

Pagina: 147 / 230<br />

global public reference structuur


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Het lijkt er op dat soft-links het best gespecificeerd kunnen worden in een global public folder van<br />

een aan het masterproject gerelateerd package. Ze staan dan met z'n allen centraal in een lijstje, en<br />

hoeven alleen daar te worden bijgehouden. Er is dan wel een mechanisme nodig in de build tools,<br />

om ook de global public folders van de eigen tree via die soft-link te benaderen en niet rechtstreeks,<br />

dan wel dat ze juist niet via soft-links benaderd worden, maar wel rechtstreeks, maar in ieder geval<br />

niet dubbel. Hopelijk is dit verder oplosbaar zonder bijdrage van <strong>Climbexion</strong>. <strong>Climbexion</strong> zou<br />

mogelijk slechts moeten bewaken dat soft-links niet buiten de working-tree of de info-tree<br />

verwijzen.<br />

Het kan <strong>voor</strong>komen dat de ene televisie een tuner gebruikt van Fabrikant A, met een driver in<br />

package TunerA, en de andere televisie een tuner van Fabrikant B met de driver in TunerB. Beiden<br />

implementeren interfaces uit de UHAPI standaard. De middleware moet dus de ene keer zijn<br />

referentie gegevens inlijven uit de global public folder van TunerA, en de andere keer uit de global<br />

public folder van TunerB, vaak afhankelijk van het project, en soms afhankelijk van diversity<br />

binnen het project. In het laatste geval moet de build procedure de juiste soft-link kiezen,<br />

afhankelijk van build parameters.<br />

Waarom wordt dit niet opgelost met louter Koala component structuren? Ik denk dat deze methode<br />

een redelijk overzichtelijke structuur is, <strong>voor</strong> ieder die aan de software werkt. De structuren van de<br />

pd files zijn normaal niet zichtbaar <strong>voor</strong> iemand die met de file browser door de tree gaat. Normaal<br />

werk je aan de sources <strong>voor</strong> één executable tegelijk. Die staan dan in een subtree.<br />

Waarom kan dit beter opgelost worden met pd files? Wat in deze structuur niet kan is een package<br />

met onderdelen <strong>voor</strong> de ene executable en met onderdelen <strong>voor</strong> de andere. Een package kan zich<br />

slechts in één tree tegelijk ophouden. Dit is een extra eis aan een package. Normaal is een package<br />

een eenheid van distributie en beheer, een extra eis kan betekenen dat een package opgesplitst moet<br />

worden. Als je dit met pd files regelt, om opsplitsing te <strong>voor</strong>komen, dan kan een package zelf<br />

mogelijk zo gestructureerd worden, dat er meerdere pd files in <strong>voor</strong>komen. Er is dan verschil tussen<br />

een <strong>Climbexion</strong> package en een Koala package. Een <strong>Climbexion</strong> top folder van package Pa0 zou<br />

dan kunnen bestaan uit de folders: Pa0-computer-1, Pa0-computer-2, Pa0-common, Pa0-gpf.<br />

2.6.4 Build bij NXP<br />

Koala als make tool<br />

De cd files van Koala bevatten <strong>voor</strong> iedere c file (bij<strong>voor</strong>beeld foo.c) een module clausule, (de<br />

clausule foo). Zo'n clausule is de entiteit die vertaald moet worden in een h file (foo.h), waarbij<br />

gegevens uit gerefereerde id files en dd files worden bewerkt en ingelijfd in de h file. De buildgraph<br />

daar<strong>voor</strong> wordt geconstrueerd tijdens uitvoering van het engine dat in de Koala documentatie is<br />

beschreven. Het genereren vindt meen ik plaats onder de eigen besturing van Koala, dus niet met<br />

behulp van een make tool. De folder met header files (één per nodige module) die Koala bijhoudt<br />

zijn daarna de de basis van de buildgraph.<br />

Test harness generator<br />

Voor het audio/video platform wordt een aparte executable gemaakt, om dit platform te testen. De<br />

methods van de UHAPI interfaces kunnen in deze executable rechtstreeks aangeroepen worden met<br />

behulp van een menu en de remote <strong>control</strong>. Ook kunnen de interfaces gebruikt worden in testscripts<br />

Pagina: 148 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

via een RPC methode tussen een desktopcomputer en een televisie, waarbij het script verwerkt<br />

wordt door een tool op de desktop. Het test-harness bestaat uit software <strong>voor</strong> menu en remote<br />

<strong>control</strong> enerzijds en <strong>voor</strong> communicatie met een testscript op de PC anderzijds, en wordt <strong>voor</strong> een<br />

belangrijk deel automatisch gegenereerd.<br />

De test harness generator van het platform onderhoudt veel menu files, en veel header en c files. De<br />

cd file van het harness moet afgestemd blijven met de cd file van het platform. Allen moeten ook<br />

nog eens afgestemd blijven en met een aantal id en dd files. Een aantal interfaces van het platform<br />

worden niet bediend door het harness, zoals bij<strong>voor</strong>beeld de pump en pump engine interfaces. Die<br />

worden door de harness component doorgegeven naar de top cd file.<br />

Misschien is de generator lastig te combineren met Koala, en is hij daarom buiten de build<br />

procedure gebleven. Mogelijk speelt ook mee, dat de repository (Synergy) <strong>voor</strong>al <strong>voor</strong> sources is<br />

bestemd, dus niet <strong>voor</strong> de files die uit een reguliere build komen, en is er daarom niet gezocht naar<br />

een methode om de generator in de build procedures te krijgen. Dus moeten de ontwikkelaars zelf<br />

het test-harness genereren als dat nodig is en daarna het nieuwe harness overdragen aan de teamdrawer.<br />

Hier gaan dingen fout als in latere project stadia <strong>voor</strong>al met product software getest wordt.<br />

De ervaring leert dan ook dat het zinvol is om dergelijke generatoren koste wat het kost in de<br />

reguliere build procedures in te bouwen, en het gegenereerde te beschouwen als derived files. Als<br />

het genereren nagelaten wordt leidt dat vaak niet meteen tot compilatie fouten, maar wel tot<br />

moeilijk te determineren fouten op run tijd. Een opmerkelijk fenomeen doet zich hierbij <strong>voor</strong>: als<br />

een ontwikkelaar tegen het probleem aanloopt is het vaak de eerste keer dat die ertegenaan loopt en<br />

dus zoekt hij zich wezenloos. De fout staat maar zelden <strong>voor</strong>aan in de persoonlijke checklist van de<br />

fout zoekende programmeur. Maar toch: velen hebben ooit zo'n probleem opgelost.<br />

Iets anders dat mis gaat met de test-harness generator is de “vertaling” van constanten. Ik bedoel<br />

hiermee symbolen die in een nummer vertaald worden door de compiler. Toen ik NXP verliet was<br />

dit probleem nog niet opgelost. Het tool dat de testscripts afhandelt gebruikt een andere notatie<br />

wijze van de declaratie van deze symbolen dan wat geleverd wordt door de generator. Dit heeft<br />

geleid tot een dubbele registratie van de constanten: zowel in de data definitie files van Koala als in<br />

aparte tekst files <strong>voor</strong> het test tool. Ook zo'n dubbele administratie is niet aan te bevelen, en een<br />

bron van fouten.<br />

Er zijn nog enkele van dergelijke generatoren in gebruik, maar daarmee heb ik niet of nauwelijks te<br />

maken gehad, dus die blijven hier onbeschreven.<br />

2.6.5 Versnipperingen<br />

Meerdere buildgraphs en build scripts<br />

Hoewel de binnen NXP gebruikte (recent timestamp) make methode toestaat dat er één build script<br />

wordt gebruikt <strong>voor</strong> alle targets, is dit niet de werkwijze binnen NXP. Er is gescheiden beheer van<br />

build scripts, gewoon omdat degene die verantwoordelijk is <strong>voor</strong> een product build niet<br />

verantwoordelijk is <strong>voor</strong> een platform build, en de beheerder van een unit-test build weer een ander<br />

kan zijn. De build scripts bevatten de duiding van het target, de cross-compiler/linker en overige<br />

Pagina: 149 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

generator referenties, en de top cd file.<br />

Dank zij KOALA is er weinig reuse van intermediate results, zoals object files. Dus kan elke<br />

buildgraph zijn eigen build folder hebben. Er is één script per target met opties als debug, assert,<br />

optimize en dergelijke, die ieder hun eigen folder krijgen. Per folder wordt er één make file<br />

(buildgraph) gemaakt.<br />

Binnen een buildgraph zijn er subgraphs <strong>voor</strong> speciale doeleinden, bij<strong>voor</strong>beeld om een build vanaf<br />

scratch uit te voeren. Dit vind je ook terug in de build scripts.<br />

Nu er gebruik wordt gemaakt van “COM” is er een hoeveelheid shared intermediate result files. De<br />

structuur is navenant:<br />

● Er is een gemeenschappelijke “general” folder met een gegenereerde make file waarin de<br />

buildgraph <strong>voor</strong> de general derived file wordt beschreven.<br />

Er is een build folder <strong>voor</strong> elke target. Waarin de make file wordt geplaatst die de buildgraph van<br />

de target beschrijft, en een script dat eerst de “general” build uitvoert en dan de eigen build.<br />

Ontwikkelingsgang<br />

Oorspronkelijk in de Tv software werd er één build folder (met een inner-reach structuur) gebruikt.<br />

Dat wil zeggen één <strong>voor</strong> iedere executable: “debug” executable en “optimize” executable hadden<br />

ieder hun eigen build folder.<br />

Met de komst van Koala kwam een test harnas <strong>voor</strong> het AV platform in een andere build folder dan<br />

een test harnas <strong>voor</strong> Middleware. Deze build folders stonden en staan in de top folder van de tree.<br />

Deze indeling is er nog steeds, maar om een aantal redenen zijn een aantal derived files in een eigen<br />

folder terecht gekomen.<br />

● Toen Philips SC dedicated chips ging maken <strong>voor</strong> televisies kwam een deel van de software<br />

ontwikkeling <strong>voor</strong> rekening van SC en een deel maakte de klant, en kwamen er export<br />

limitations. Oorspronkelijk gebeurde dit doordat object files uit de build folder werden<br />

geselecteerd, en in een statische library werden geplaatst, die zelf in een folder van het<br />

betreffende package stond. (één <strong>voor</strong> testen: (assert, logging, debugging), één <strong>voor</strong><br />

optimize). Dit gebeurde dus met een extra kopieerslag.<br />

● Toen kwam KOALA waardoor dit moeilijker was. Immers, door de compile time binding<br />

van KOALA is de objectcode van een module in executable A anders dan de objectcode in<br />

executable B. Bij software <strong>voor</strong> de MIPS zag men de constructie dat een static object library<br />

ingebed werd in een KOALA component, die de interfaces naar die library verzorgde. Voor<br />

de TriMedia werden executables beschikbaar gesteld. In beide gevallen één <strong>voor</strong> optimize<br />

en één <strong>voor</strong> het testen.<br />

● Met de introductie van de “com” component methode kwam er in de top van de tree een<br />

folder <strong>voor</strong> gegenereerde header, stub, en proxy files.<br />

● Met de introductie van het build forest gaan deze gegenereerde header en c files in de global<br />

public folder komen, waarin ze thuishoren.<br />

● Nu, met het build forest, wordt het weer eenvoudig mogelijk om binary code per package te<br />

distribueren. Echter de oude situatie waarin gegevens gekopieerd werden uit de build folder<br />

in een repository folder lijkt achterhaald. De gegenereerde code kan beter door de build<br />

procedures meteen in de juiste folder in het package geplaatst worden zodat er een uniforme<br />

Pagina: 150 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

manier van werken is <strong>voor</strong> de builds in import/export gelimiteerde en in de ongelimiteerde<br />

omgeving; <strong>voor</strong> de producent van het package en <strong>voor</strong> de consument. De uniforme methode<br />

betreft zowel de builds van binaries, als ook de packaging die nodig is om een werkend<br />

systeem te onderhouden in de televisie. De build folders in de top van de tree zullen geheel<br />

verdwijnen.<br />

● Vermoedelijk wordt Koala op termijn opgevolgd door een methode die wat minder uitgaat<br />

van de “resource restricted” aard van een televisie en de daarvan profiterende compile time<br />

oplossingen: er is misschien wel genoeg geheugen en genoeg processing power <strong>voor</strong><br />

runtime oplossingen, en het overslaan van code kan desnoods zelfs plaatsvinden in<br />

installatie procedures. (In software kun je nu eenmaal alles van hot naar haar verhuizen.)<br />

Dan ontstaat een systeem waarin diverse targets diverse object files en diverse header files<br />

kunnen delen, Voorlopig heb ik hiermee geen rekening gehouden. In de hele elektronica<br />

branch zal de software wel variëren van uiterst resource restricted systems, to zeer resource<br />

rich systems.<br />

● Import/Export limitations dragen ook bij aan de versnipperingen omdat het target van een<br />

build gescheiden wordt van de intermediate result files. De targets zijn de (dynamic link)<br />

libraries of de executables. Zij worden altijd beschikbaar gesteld. De intermediate result files<br />

zijn bij<strong>voor</strong>beeld de object files en de door KOALA gegenereerde header files. Deze laatsten<br />

worden mogelijk niet beschikbaar gesteld aan derden, of ze worden toch niet gebruikt door<br />

degenen die het target niet zelf willen genereren.<br />

● Naast Philips CE worden de chips verkocht aan een groot aantal afnemers. Geen van die<br />

afnemers werkt met KOALA, dus dat is een interne aangelegenheid van NXP, in haar deel<br />

van de software. Daardoor is het leveren van gegenereerde code onvermijdelijk: de klant<br />

beschikt niet over de Koala generatoren.<br />

● Sommige klanten werken met de volgende procedure om een compleet product samen te<br />

stellen: source code, static libraries, dynamic libraries en executables worden opgestuurd<br />

naar de klant, en die maakt er een product package van dat wordt teruggestuurd. Dit is een<br />

no-nonsense procedure: je levert naast libraries natuurlijk geen source code die toch niet<br />

gebruikt wordt <strong>voor</strong> het samenstellen van het product. Deze methode is een combinatie van<br />

import en export limitations. Het is niet bepaald een optimale methode <strong>voor</strong> een<br />

gemeenschappelijk project.<br />

De bedoeling van <strong>Climbexion</strong> is dat deze wijze van werken vervangen wordt door methoden<br />

waarbij ieder optimaal kan beschikken over source informatie, en zelf de binaries kan<br />

genereren waarin de eigen software is ingebed.<br />

Deze klanten eisen dat de software kwaliteit die NXP levert aan het begin van de<br />

samenwerking hoger is, dan wat NXP/Philips CE gewend zijn. Dat is natuurlijk niet zonder<br />

reden: nu de import/export limitations tot het uiterste worden doorgevoerd is het lokaliseren<br />

of toewijzen van een bug geen peulenschilletje.<br />

Bij NXP zeggen ze: wij passen ons aan aan de Aziatische manier van zaken doen. Ik<br />

verwacht en ik hoop dat deze kwaliteit verbetering lukt zonder het idee van gezamenlijke<br />

chip en software ontwikkeling geweld aan te doen. Het is natuurlijk niet de bedoeling dat<br />

gewacht wordt tot het reference model van NXP helemaal volmaakt klaar is <strong>voor</strong>dat de<br />

eerste grote klant instapt. Daar<strong>voor</strong> heb ik mijn repository niet <strong>Climbexion</strong> genoemd. En<br />

Pagina: 151 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

bovendien is internationaal samenwerken om te ontwikkelen daar<strong>voor</strong> veel te leuk.<br />

Mijn verwachting dat kwaliteit verbetering lukt is hierop gebaseerd: NXP “leunde” soms<br />

wat te veel op acceptatie tests van CE, om daarna met verve de daaruit <strong>voor</strong>tvloeiende<br />

problemen op te lossen. Die tests hadden ze zelf kunnen doen: acceptatie tests horen een<br />

formaliteit te zijn. Je klanten horen jou niet te vertellen wat de status is van je product, maar<br />

jij hoort je klanten te vertellen wat de status is van je product.<br />

De invloed op builds<br />

De versnipperingen zijn als volgt samen te vatten: Containers <strong>voor</strong> derived files bevinden zich op<br />

diverse plaatsen in de working-tree.<br />

Deze containers bevatten natuurlijk? de bijbehorende permanente dependency lists, die van hen zelf<br />

en die van hun content. De permanente dependency lists moet waarschijnlijk even versnipperd<br />

opgeslagen worden als de derived files. Veel containers kunnen waarschijnlijk daar in de workingtree<br />

geplaatst worden, waar er een primary source file bestaat met gegevens over die container. Op<br />

de plaats waar een Koala top component staat, daar zullen ook wel containers horen, maar toch<br />

zeker ook in global public folders. Build tools moeten de versnipperingen faciliteren.<br />

Als build targets en hun intermediate result files gedistribueerd worden betreft dit waarschijnlijk<br />

een <strong>voor</strong>af afgesproken beperkte hoeveelheid varianten. (<strong>voor</strong> TriMedia bij<strong>voor</strong>beeld: assert,<br />

optimize). Maar <strong>voor</strong> persoonlijke opslag zouden mogelijk meerdere varianten, en gemengde<br />

targets gewenst kunnen zijn, dus de opslag in satellites kan complexer zijn dan de opslag in export<br />

drawers. Met name het activeren van logging van de inhoud van variabelen kan aanleiding zijn tot<br />

meer persoonlijke intermediate result files en targets. Binnen de debug containers komen dan<br />

objects waarin logging is geactiveerd, en mogelijk ook varianten, waarin logging niet is geactiveerd.<br />

2.6.6 Other-focused build results<br />

In een team-drawer zonder transfer-drawer waarin dagelijks build results worden opgeslagen moet<br />

welhaast gebruik worden gemaakt van other-focused build results. Als de clean build klaar is, kan er<br />

alweer een changeset zijn overgedragen, en slaat het build result niet langer op de tip van drawer.<br />

Gegeven de aard van een derived files: ze horen bij een tag, en zijn een vorm van informatie over de<br />

tag maakt dat ze “principieel” behoren tot de other-focused files.<br />

Een reden om build results überhaupt op te slaan in de team drawer: builds kunnen onbetrouwbaar<br />

zijn, zodat je regelmatig clean builds wilt uitvoeren. Dit kan efficiënt worden uitgevoerd door de<br />

build manager die dit periodiek doet <strong>voor</strong> het hele team. Dit argument vervalt als builds onder alle<br />

omstandigheden erg betrouwbaar zijn, maar spreekt weer erg aan als per work-item een satellite met<br />

working-tree gebruikt wordt.<br />

Een andere reden om other-focused files te gebruiken: een ontwikkelaar test met twee build targets,<br />

en <strong>control</strong>eert nog twee andere builds op foutloos resultaat, je hebt dan 4 builds gepleegd maar het<br />

team heeft behoefte aan de opslag van een stuk of 16 build targets. Ook hier zou de build manager<br />

dit geregeld kunnen doen <strong>voor</strong> het hele team.<br />

Build <strong>voor</strong> baselines en patches: in principe zouden build results kunnen worden overgedragen<br />

samen met de source files. Vanuit drawers die exclusief door een build-manager worden beheerd.<br />

Dus zijn other-focused files hier mogelijk vermijdbaar.<br />

Pagina: 152 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Mogelijk wordt in de toekomst meer gewerkt met script talen zoals bij<strong>voor</strong>beeld Python. Die<br />

hoeven niet gecompileerd te worden. Of met JIT compilers die op runtime compileren, net <strong>voor</strong>dat<br />

de module gebruikt wordt, hoewel sommige JIT compilers byte code compileren naar machine<br />

code. Dit vermindert mogelijk de behoefte aan builds en build results, en misschien ook de behoefte<br />

aan de opslag ervan in een repository. Soms kun je zulke programma's niet alleen laten<br />

interpreteren, maar kun je ze ook statisch compileren, om de werking te versnellen. De behoeft aan<br />

wel of niet other-focused build results is hier niet direct te overzien.<br />

Builds worden momenteel gebruikt als een soort kwaliteit borging bij overdrachten. Dit is niet<br />

alleen omdat mensen steken laten vallen, maar ook omdat merge programma's niet volledig zijn te<br />

vertrouwen. Dit gebruik is op zich geen reden om build results op te nemen. Wat je bij een<br />

overdracht of periodiek mogelijk hierom wilt opslaan in de repository is de boodschap van het build<br />

programma: “build finished with error code 0” (of niet natuurlijk). Dit is typisch informatie die in<br />

een een other-focused file wordt geplaatst: het vertelt iets over het snapshot.<br />

2.6.7 Conclusies<br />

Export limitations maken het noodzakelijk dat binary code wordt opgenomen in de repository,<br />

verschillen in “software engineering practices” tussen de teams noodzaken soms tot de opslag van<br />

build results, ook import limitations maken het soms wenselijk. Efficiency op de “werkvloer” kan<br />

aanleiding zijn om build results op te nemen in de repository.<br />

Als je binaries opneemt in <strong>Climbexion</strong> dan lijkt een build methode gebaseerd op “different”<br />

timestamp of “content hash” onvermijdelijk, en alleen al door het gebruik van een repository is deze<br />

methode te verkiezen boven de “recent” timestamp methode, zelfs als je de build results niet<br />

opslaat. Als je build results via de repository beschikbaar wilt stellen, dan is het absoluut<br />

noodzakelijk.<br />

Het gegeven dat distributies plaatsvinden per package betekent dat te distribueren build folders met<br />

hun inhoud worden opgeslagen bij die packages, misschien als tarball, liefst als een verzameling<br />

first class citizens. Build targets moeten in ieder geval als first class citizens behandeld worden in<br />

verband met de limitations.<br />

We wisten reeds: build managers kunnen langdurig builds uitvoeren, zonder team-drawer en/of<br />

transfer-drawer langdurig te blokkeren <strong>voor</strong> wijzigingen: door build resultaten op te nemen in owndrawer-focused<br />

files.<br />

2.6.8 Build extra's. DianPush Build<br />

Gatherers en Outliners<br />

Probleem:<br />

1. Een beetje intelligente linker geef je een start module, en je wijst hem een verzameling met<br />

object-files. De linker zoekt bij external references, die modules die de externals bevatten.<br />

Dit gebeurt met een verzamel algoritme of gatherer. Na het linken is bekend welke modules<br />

ingelijfd zijn, en daarmee is de dependency list bekend, en kun je vaststellen of er gelinkt<br />

had moeten worden.<br />

2. Een compiler geef je een source module en wijst hem een verzameling met import files. De<br />

Pagina: 153 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

compiler lijft dankzij de referenties in de code de betreffende import files in. Dit gebeurt met<br />

een andere soort gatherer. Na het compileren is de dependency list bekend en kun je<br />

vaststellen of er opnieuw gecompileerd had moeten worden.<br />

Gatherer type één. Linkers kunnen dit op libraries. De link-editor op IBM mainframes had zo'n<br />

algoritme. Het werd daar altijd toegepast omdat een object file altijd in library terecht kwam.<br />

Op de Microsoft en Unix systemen waarop ik sinds de jaren tachtig actief ben worden libraries<br />

<strong>voor</strong>al toegepast <strong>voor</strong> standaard software libraries, en minder <strong>voor</strong> de software die men zelf<br />

onderhanden heeft. Daar verzamelt de linker niet wat hij nodig heeft uit het aanbod, maar lijft hij<br />

alles in dat aangeboden wordt, met uitzondering van datgene dat in de standaard libraries staat want<br />

daar<strong>voor</strong> gebruikt hij de gatherer.<br />

De eerste gatherer eist dat zijn input pool in zijn geheel op orde is: alle bekende primary sources<br />

moeten zijn gecompileerd tot objects. Immers een unresolved reference vertelt niet in welke file de<br />

betreffende external wordt verwacht, dus make weet niet welke file gemaakt moet worden. Om de<br />

pool op orde te krijgen kunnen eventueel script nodes buiten de subgraph van de executable<br />

uitgevoerd worden.<br />

De aard van de tweede gatherer is zo dat die weet welke file ingelijfd moet worden. Als die er niet<br />

is, dan kan worden nagegaan of er een subgraph bestaat met de file als target, en uiteindelijk of zo'n<br />

subgraph kan worden aangemaakt, als die nog niet bestaat.<br />

Kun je met gatherers een buildgraph maken door gebruik te maken van uitgeklede linkers en<br />

compilers die de gatherer bevatten, en die <strong>voor</strong>af werken? Dan is er, in ieder geval <strong>voor</strong> het<br />

verzamel algoritme van de linker het probleem die pas kan worden uitgevoerd als de objects er zijn,<br />

zelfs als het een verzamel algoritme type twee zou zijn. Hoe <strong>voor</strong>af is dat nog? Voorlopig zoeken<br />

we een oplossing zonder <strong>voor</strong>af de graph te maken.<br />

Wat een <strong>voor</strong>waarde is <strong>voor</strong> de different timestamp methode, namelijk de permanente opslag van de<br />

timestamp van een file, is tevens een optimalisatie van het automatische generatie proces. Er wordt<br />

gebruik gemaakt van de dependency lists van de vorige keer, en alleen die dependency lists met hun<br />

subgraphs worden bijgewerkt waarvan minstens één lid is gewijzigd, of verdwenen, en uiteraard<br />

wordt de betreffende script node uitgevoerd.<br />

Een dependency list die uitsluitend uit source (niet afgeleide) files kan bestaan kan worden<br />

geselecteerd door de gatherer en opgeslagen als output file van zijn script node. Ook het linker<br />

algoritme waar<strong>voor</strong> de object library <strong>voor</strong>af op orde moet zijn kan op die manier werken. Deze<br />

dependency list wordt gemaakt door het verzamel algoritme, door de gatherer, niet <strong>voor</strong>af, maar<br />

tijdens het vuren van de script node en is na afloop beschikbaar <strong>voor</strong> permanente opslag, samen met<br />

de versie identificatie van de bijbehorende input files.<br />

Stel de gatherer wil files inlijven die derived zijn. De dependency list moet dan mogelijk al gaande<br />

worden ontwikkeld. De file die op het punt staat om ingelijfd te worden moet diep ge<strong>control</strong>eerd<br />

worden op actualiteit, en misschien gegenereerd worden. De uitvoering van de script node kan pas<br />

verdergaan nadat <strong>control</strong>e en/of generatie klaar is. Een bezwaar tegen zo'n recursieve procedure is<br />

dat mogelijk niet iedere generator en niet ieder operating system faciliteiten levert om te wachten op<br />

een file, die mogelijk nog gemaakt moet worden. Een ander bezwaar is dat er meerdere tools<br />

tegelijk aan de gang zijn, die elkaar mogelijk ernstig vertragen, omdat ze allen liefst alle<br />

beschikbare geheugen gebruiken. Voor een simpele oplossingen zonder pipes geldt verder: van die<br />

generatie tools is er één aan het werk, en de anderen wachten op hem, terwijl ze hem ondertussen<br />

Pagina: 154 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

vertragen. Voorlopig noemen we dit: “the unwanted recursion” als we ernaar verwijzen.<br />

Soms is er een alternatief <strong>voor</strong> deze recursive procedure. De oplossing die ik ken is een push<br />

methode. Na afloop zijn alle targets up-to-date. Dit is bij<strong>voor</strong>beeld mogelijk onder de volgende<br />

condities:<br />

1. Elke generatie tool werkt met een primary input.<br />

2. De primary input van een generatie tool moet als zodanig herkenbaar zijn, Bij<strong>voor</strong>beeld, een<br />

tool dat slechts nodig is <strong>voor</strong> twee van de tien c files gebruikt niet de parameters uit het<br />

script, maar leest een parameter file als primary input. De c files zijn dan <strong>voor</strong> hem geen<br />

primary input, maar de speciaal getypeerde parameter files wel.<br />

3. Voorlopig eisen we dat primary input files altijd source of derived files zijn, zodat er <strong>voor</strong><br />

iedere script node een primary input file bestaat, zelfs als deze leeg is, of als zijn inhoud op<br />

de een of andere manier verondersteld kan worden. Andere oplossingen dan met een primary<br />

file beschouwen we <strong>voor</strong>lopig als frivool, en goed <strong>voor</strong> later. Nu gaat het om een rigide<br />

systeem. Waarschijnlijk is rigide hier beter dan frivool. Ook <strong>voor</strong> secondaire data zoals<br />

opties prefereren we trouwens een input file boven environment variables, zodat een<br />

verandering opgemerkt wordt.<br />

4. Je moet een generatie volgorde kunnen aanwijzen: bij<strong>voor</strong>beeld je wilt eerst alle idl<br />

compilaties uitvoeren, dan koala, dan c compilaties, dan zo nodig object libraries bijwerken,<br />

tenslotte de te vernieuwen executables maken. Kortom er is een categorie indeling van de<br />

generatie tools, en er is een volgorde waarin de categorieën afgehandeld worden. Zo'n<br />

categorie zullen we een push-position noemen.<br />

De eerste drie condities zijn natuurlijk ook heel praktisch als je met een pull algoritme zou werken.<br />

We zullen ze de “build preconditions” noemen. Merk op dat aan de output zijde niet geëist wordt<br />

dat er een output file gemaakt wordt met dezelfde name als primary input file. De opgeslagen<br />

dependency list is natuurlijk wel een file die dezelfde name krijgt als de primary input file.<br />

Push make op een volledige working-tree is vermoedelijk een make procedure die je het bloed<br />

onder de nagels vandaan kan halen door alle extra werk die hij verricht <strong>voor</strong> hij de ene executable<br />

levert die je nodig hebt. Aan de andere kant is dit toch wel de natuurlijke methode als je gebruik<br />

wilt maken van de dependency lists van de vorige keer: de nieuwe list is een output file van de<br />

gatherer, en is beschikbaar na afloop van het script van de node en kan dan <strong>voor</strong>zien worden van de<br />

version metadata van de input.<br />

Stel je hebt een folder <strong>voor</strong> derived files <strong>voor</strong> zowel een product target, een platform target en enige<br />

targets <strong>voor</strong> unit tests. We gebruiken een c compiler, een library tool en een linker. Als je een<br />

product target wil maken dan is de target selectie best wel mogelijk: er is een primary source file<br />

<strong>voor</strong> ieder target. Het push algoritme slaat dan de primary source files <strong>voor</strong> de andere targets over.<br />

Iets soortgelijks kan vervolgens gelden <strong>voor</strong> libraries. En tenslotte selecteert een product build de c<br />

source files van de working-tree, minus de c files <strong>voor</strong> tools, en minus de c files <strong>voor</strong> test harnesses<br />

enzo<strong>voor</strong>t. Ook deze selectie lijkt niet te moeilijk. Een unit test gebruikt de c file sources uit zijn<br />

harness folder en de modules van een paar componenten. Het platform target gebruikt de c files van<br />

zijn harness folder, plus de c files in de platform subtree minus folders <strong>voor</strong> tools en test harnesses.<br />

Folders <strong>voor</strong> harnesses gebruiken mogelijk soft-links naar extra resources. Expliciete subtree<br />

selectie in de working-tree, en subtree duiding door folder entity type selectie of exclusie lijken<br />

redelijk stabiel, en niet erg onderhoud gevoelig. Ze zouden simpel en overzichtelijk moeten zijn.<br />

Maar anderzijds: de NHSW tree bevat een allegaartje aan folder entity typen, en is een integratie<br />

van allerlei substructuren, er is legacy. Simpel, overzichtelijk, betrouwbaar, en stabiel is niet<br />

Pagina: 155 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

gegarandeerd.<br />

Expressies <strong>voor</strong> afbakening van de input zouden <strong>voor</strong> targets en intermediate result files kunnen<br />

worden vastgelegd. We noemen de software die tijdens build een afbakening beschikbaar stelt een<br />

outliner. Die software zou dus van de expressies gebruik kunnen maken. We blijven rigide: een<br />

outliner die een outline beschikbaar stelt doet dat <strong>voor</strong>lopig in de vorm van een index met de<br />

resource locator's van files.<br />

Outliners kun je gebruiken als gatherers ontbreken, of nog niet bruikbaar zijn. Ze worden gebruikt<br />

in push methoden <strong>voor</strong> primary source selectie uit de working-tree, en sturen ook die pull<br />

methoden, waarvan de primary source selectie volledig <strong>voor</strong>af wordt geconstrueerd.<br />

Voor een pull methode kan de buildgraph als volgt gemaakt worden. De outliner van de linker weet<br />

waar in de working-tree de primary source files van zijn libraries staan, maakt er een lijst van, en<br />

vertaalt de source namen in library namen. De outliner van een library weet waar zijn c files staan<br />

en vertaalt de namen van de c files in namen van de object modules. De vertaalde namen vormen de<br />

dependency list <strong>voor</strong> de script node die de library aanvult, of de linker creëert.<br />

Bij een push methode wordt eerst een outline gemaakt van alle betrokken c files. Als de object files<br />

gemaakt zijn, wordt een object outline gemaakt <strong>voor</strong> de eerste library en wordt die bijgewerkt. Zo<br />

worden ze successievelijk bijgewerkt. Tenslotte wordt de outline van libraries <strong>voor</strong> de linker<br />

vastgesteld en wordt die uitgevoerd.<br />

In het algemeen lijkt de push methode de <strong>voor</strong>keur te hebben boven pull, immers in de build sessie<br />

hoeven de script nodes dan niet in een graph structuur te worden gezet, maar in simpeler<br />

gesorteerde lijst (precondition 4) Bij een pull methode moeten de outlines van te voren beschikbaar<br />

zijn, maar bij een push methode hoeft een outline pas beschikbaar te zijn als je aan een pushposition<br />

begint. Er kan gebruik worden gemaakt van derived files die wel of niet zijn ontstaan in<br />

<strong>voor</strong>gaande push-positions.<br />

Kun je gatherers gebruiken als outliners?<br />

De primary file waarop de gatherer wordt losgelaten in fase één van de build moet up-to-date zijn,<br />

dus een source file zijn. Je moet de gatherer dus <strong>voor</strong>af gebruiken. Dan geldt <strong>voor</strong> een aantal<br />

references misschien dat ze unresolved zijn, en van een aantal dat ze derived files zijn. Een garantie<br />

zou moeten zijn dat de dependency list compleet is, dus liefst geen references of altijd dezelfde in<br />

de derived files. Verder geldt <strong>voor</strong> iedere derived file dat de primary input name moet zijn af te<br />

leiden uit de file name. Deze primary input file en de erbij behorende outline zijn zijn dependency<br />

list. In de (rigide) beschrijving van DianPush ga ik er vanuit dat er geen gatherers gebruikt worden.<br />

In feite ga ik ervan uit dat het afgebakende deel van de working-tree niet top-down tot stand hoeft te<br />

komen.<br />

In de working-tree worden outliners gebruikt om een build zoveel mogelijk te beperken tot de<br />

essentiële primary input files, en om restricties op te leggen aan de plaatsen waar de gatherer mag<br />

zoeken naar secondary input files. NHSW kent secondary input files die alleen binnen een<br />

component of binnen een package gebruikt mogen worden. Een outliner kan dit faciliteren en zo<br />

bijdragen aan de integriteit en onderhoudbaarheid van de software. Als je zondigt en ten onrechte<br />

zo'n file wilt inlijven dan heeft dat een error tot gevolg: hij behoort immers niet tot de outline.<br />

Compilers en linkers zijn typisch entiteiten die gebaat zijn met een gatherer. Normaliter is die<br />

ingebouwd. Folders en libraries <strong>voor</strong> derived files zijn typisch entiteiten die een outliner gebruiken<br />

Pagina: 156 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

die in zijn geheel ingelijfd wordt. Gathering <strong>voor</strong> een linker wordt vaak vermeden met zeer<br />

nauwkeurige outliners.<br />

Overall outliner. Inleiding<br />

Koala is een gatherer om een outline te maken. De component description files (cd-files) bevatten<br />

een lijstje met in te lijven componenten en een lijstje van modules die bij de component horen. Voor<br />

ieder target is er een top cd-file. De begrenzing van Koala is de working-tree. De begrenzing van de<br />

verzameling waaruit de linker de objects verzameld <strong>voor</strong> het target: die lijst met modules wordt<br />

door Koala samengesteld door een componenten tree op te zetten. Koala gebruikt elementen uit het<br />

working-tree landschap om de componenten tree te trimmen en om modules te selecteren: met<br />

name pd files, id files dd files. Ook gegevens in de cd files worden bij het trimmen gebruikt. De cd<br />

files hebben een aantal c files uit hun directe omgeving onder hun hoede en staan in contact met een<br />

aantal andere cd files en bij een build word een subgraph samengesteld van de cd files.<br />

Ik heb niet veel werk verricht <strong>voor</strong> de TriMedia's. De programmeurs daar gebruikten recursive<br />

make, maar waren blij dat ze er dankzij Koala vanaf konden komen. Als ik hun gemopper goed<br />

begrepen heb: ze hadden het pull algoritme vervangen door een ander recursief algoritme. Daardoor<br />

werd er wel eens gevuurd <strong>voor</strong>dat de files uit de dependency list up-to-date waren. Met Google<br />

vindt je er talloze beschrijvingen en <strong>voor</strong>beelden van. Trouwens je vindt dan ook veel commentaar<br />

op recursive make, maar ook regels om het goed te doen. Ik denk dat ze recursive make <strong>voor</strong>al<br />

gebruikten vanwege het feit dat iedere make file een aantal sources onder zijn hoede heeft en en in<br />

verbinding staat met andere make files.<br />

Waarschijnlijk komen er of zijn er meer verzamelende outliners, dan Koala. Die verzorgen de<br />

afbakening van waarschijnlijk alle script nodes. We zullen zo'n outliner een custodian outliner<br />

noemen. Maar in het vervolg, als we spreken we over “de outliner” dan bedoelen we de custodian<br />

outliner. Omdat de component descriptor file reeds <strong>voor</strong>komt bij Koala zullen we spreken over een<br />

custodian file . Een custodian heeft in zijn directe omgeving een aantal source files onder zijn hoede<br />

en staat in verbinding met enkele andere custodians. Onder zijn hoede hebben of hoede zelf zullen<br />

we vertalen als “notice”. Onder “zijn hoede” zal ik noteren als “in notice” Custodian is toch wel een<br />

mondvol. We zullen dit afkorten tot dian.<br />

Voorlopig ben ik rigide en plaats naast iedere cd file van Koala een dian file, Daarnaast komen er<br />

nog dian files die folders <strong>voor</strong> h , id, dd, idl files in de gaten houden, buiten de componenten. En<br />

tenslotte zijn er de dian files met de folders <strong>voor</strong> derived files in notice. Waar Koala zelf zijn<br />

outlines bepaalt is dat natuurlijk overbodig, maar ik wil toch wel een indruk krijgen <strong>voor</strong> wat betreft<br />

de feasibility van dians. Als je naar een cd tree kijkt, dan kan een component er meermalen in<br />

<strong>voor</strong>komen. Eigenlijk is dat een vorm van node splitsten. De graph structuur is een DAG. Het lijkt<br />

logisch om een DAG toe te staan <strong>voor</strong> dians. De outliner kan daarmee rekenen: indien bij het<br />

bepalen van een outline een dian andermaal bezocht zou worden, dan wordt hij overgeslagen.<br />

Als een build start is de parameter die je aan de outliner geeft: een start dian. Je vraagt de outliner<br />

om een build outline te maken: wat de outliner retourneert: een index van dians die bij de build<br />

betrokken zijn. De index wordt mogelijk intern in de outliner gebruikt. Alle bij de build betrokken<br />

primary source inputs horen bij één van de dians in de outline. Ook primary derived inputs vallen<br />

binnen de dians, maar die staan nog niet vast. Ze kunnen immers <strong>voor</strong> een deel gegenereerd worden<br />

als het push algoritme aan de gang gaat. Zelfs, zoals we nog zullen zien, kunnen ze gaande de build<br />

Pagina: 157 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

vervallen. Een positie in een normale outline van een dian outliner bevat (<strong>voor</strong>lopig) de fully<br />

qualified name van de dian, en een local name van de file. Er komt een moment dat een file of een<br />

outline nodig blijkt als input <strong>voor</strong> een tool, dan moet het paar (dian,file) alsnog worden vervangen<br />

door de fully qualified name van de file.<br />

Voorbeelden van requests aan de outliner:<br />

Gegeven Request Resultaat<br />

Dian: /nhsw/product/target.dian Dians outline Index of dians<br />

Folder: objects<br />

Dian: /nhsw/platform/derived/object.dian<br />

File: m3.c,<br />

Dian: /nhsw/platform/tuner.dian<br />

File: m3.c,<br />

Dian: /nhsw/platform/tuner.dian<br />

Folder: object,<br />

Dian: /nhsw/platform/derived/object.dian<br />

File: m3.c,<br />

Dian: /nhsw/platform/tuner.dian<br />

De Stored Input Output File (sio file)<br />

Primary inputs outline:<br />

type: c files<br />

Secondary inputs outline:<br />

type: h files<br />

Folder to store derived output:<br />

type: obj files<br />

Is file in primary source<br />

outline of folder?<br />

Index of c files<br />

Index of h files<br />

Index with 1 folder<br />

De dependency list met version informatie van de betrokken input, samen met de lijst gegenereerde<br />

output files worden opgeslagen in een sio file. Ook de version informatie van die files wordt<br />

opgeslagen. Wijzigingen in de working-tree, waardoor input files ontbreken of opschoning acties<br />

waardoor output files ontbreken, of corruptie als een output file is gemaakt door ongeldig handelen<br />

zijn hiermee te corrigeren. Namelijk door de script node te laten vuren. Omdat we met een rigide<br />

systeem werken zijn alle ins en outs van een script node files met version data. Hier kunnen we<br />

misschien maar beter niet frivool worden.<br />

Het is denkbaar dat een generatie tool de secondary input file “foo” inlijft als die er is, maar als<br />

“foo” ontbreekt dan wordt net zo goed output geproduceerd. In dat geval verwachten we in de sio<br />

file in de output list de regel “foo” ontbreekt.<br />

Derived Folders<br />

Folders <strong>voor</strong> derived files hebben een primary source input. Deze primary input files zijn zelf nooit<br />

derived omdat ze in de allereerste push-position in het build process worden gecompileerd tot<br />

folders. De df file geeft informatie over de derived folders die samen met hem in een gewone folder<br />

staan. Een van die folders is de sio folder. In plaats van een folder <strong>voor</strong> object files, zou een library<br />

gespecificeerd kunnen worden.<br />

We noemende de primary input file een df file. In de file staat een push-position (het volgnummer<br />

<strong>voor</strong> de push volgorde). De generatie tools die horen bij die push-position schrijven hun output en<br />

hun sio file in de folders die in de df file genoemd worden. Er is altijd een sio folder. Die bevat<br />

uitsluitend sio files.<br />

Pagina: 158 / 230<br />

yes


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Waar wordt de sio file van de df file opgeborgen? In dezelfde folder als de df file of in een<br />

verzamel folder van het package. Het besluit daarover moet nog genomen worden.<br />

De dian die de df file in notice heeft, heeft ook de inhoud van de derived folders in notice.<br />

Op deze manier worden de versnipperingen bedient.<br />

Varianten<br />

Stel je hebt een script node en je doet één van de builds en de script node heeft als source input:<br />

foo versie A<br />

De dag erna doe je één van de andere builds, en nu is de source input<br />

foo versie B<br />

Dan is het de vraag: heb je hier te maken met een opvolger, of met een alternatief. Als geen van de<br />

sources gewijzigd is dan heb je zeker te maken met een alternatief. Die moet zijn ontstaan omdat de<br />

outliner de tweede keer een andere input koos, dan de eerste keer. Als dit onopzettelijk is gebeurt<br />

dan is het waarschijnlijk een fout, waarbij builds elkaar tegenwerken en waarbij de nieuwe output<br />

de vorige vervangt en opvolgt. Dit gebeurt keer keer als de verschillende build elkaar opvolgen.<br />

Varianten ontstaan niet spontaan in ons systeem. Spontane varianten zijn fouten. Wij werken met<br />

opzettelijke varianten. Stel we hebben besloten:<br />

● compiler_level {debug, assert, optimize}<br />

● computer {Mips, TriMedia, IntelP50} (Dit zorgt er<strong>voor</strong> dat de juiste cross<br />

compilers gebruikt worden)<br />

“Compiler_level” noemen we het variant type, “debug” noemen we de variant. Files die<br />

alternatieven van elkaar zijn behoren tot verschillende varianten of variant combinaties.<br />

Rigide als we zijn slaan we varianten als volgt op: Waar tot nu toe een file staat in de working-tree<br />

daar staat vanaf nu een gelijknamige folder. In die folder bevinden zich de files.<br />

Een file die altijd bruikbaar is heet “...\file\{,}”<br />

Een file in debug mode <strong>voor</strong> IntelP50 heet ...\executable\“{debug,IntelP50}”<br />

Een file kan dus heten: ...\module.o\”{assert, Mips}”<br />

of ...\global\compiler-options.txt\{optimize,}<br />

of ...\tools\linker\{,TriMedia}<br />

Bij een build wordt een file opgegeven met de varianten die gelden <strong>voor</strong> de build: de varianten file.<br />

In frivole systems hebben variant combinaties vriendelijke namen en worden ze op een andere<br />

plaats in de path-name van een file geplaatst, bij<strong>voor</strong>beeld: {,} verdwijnt, "{optimize,}" wordt<br />

optimize\, "{assert, Mips}" wordt assertMips\ en zo. De variant combinaties komen dan<br />

bij<strong>voor</strong>beeld vlak <strong>voor</strong> de file name ...\tools\TriMedia\compiler. Ook zie je wel dat varianten deel<br />

uitmaken van de file name, bij<strong>voor</strong>beeld in source files: ...\global\compiler-options-optimize.txt.<br />

Als een bepaalde input van een script node zoals een c compiler de varianten file inlijft, dan begint<br />

het ermee dat die de varianten selecteert die van toepassing zijn De betrokken de output files zijn<br />

varianten met de juiste variant combinatie in hun naam, en de gatherer selecteert de input files met<br />

de juiste variant combinatie. Vaak is dit slechts een deel van alle varianten. Een c file is geen debug<br />

of intelP50 variant, de option file <strong>voor</strong> een compiler heeft alternatieven dankzij het compiler-level<br />

type. De (cross-) compiler is een alternatief dankzij het computer type. De object file heeft<br />

alternatieven dankzij een combinatie van varianten.<br />

Pagina: 159 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Enige overwegingen.<br />

Een Koala package moet waarschijnlijk verteld worden wat de computer is, want dit beïnvloedt<br />

mogelijk de diversity. Misschien maakt het <strong>voor</strong> het package niet uit of optimize of debug gekozen<br />

is, en is dat irrelevante variant data. Computer data kan belangrijk zijn <strong>voor</strong> Koala packages: het is<br />

een diversity parameter. De output files van Koala zijn alternatieven dankzij Computer. Een<br />

eigenaardigheid van een dergelijke variant is misschien wel, dat er geen executables zijn die elkaars<br />

alternatief zijn in de projects waarin in actief was:, een TriMedia oplossing hoeft nooit op de Mips<br />

te draaien en omgekeerd. Voor Koala geldt misschien daarom ook dat gegenereerde files en object<br />

files niet als alternatieven van elkaar behandeld hoeven te worden, want die komen zo wie zo al in<br />

verschillende folders.<br />

We zouden mogelijk "target system"als variant type kunnen opvoeren. Bij<strong>voor</strong>beeld In het master<br />

project maken we software <strong>voor</strong> een Noord Amerikaanse, een Zuid Amerikaanse, en een<br />

Euraziatische televisie. Een team dat Koala niet gebruikt zou mogelijk als volgt kunnen werken: de<br />

header files waarin de diversity beschreven is zouden dan alternatieven van elkaar zijn, en de<br />

geproduceerde object files en executables ook. Dit variant type is van belang <strong>voor</strong> Koala packages,<br />

om de betreffende diversity te kiezen. De variant selecteert de diversity, De intermediate results en<br />

targets zijn varianten.<br />

Voor systemen met product families is diversity een vereiste, ook als ze Koala niet gebruiken.<br />

Diversity kan er soms toe leiden dat er tijdens compilatie een output file ontstaat, maar soms moet<br />

die juist vervallen. De preprocessor of de compiler zou dan met een geforceerde exit code moeten<br />

eindigen.<br />

Ook kan het <strong>voor</strong>komen dat soms external functies uit een programma worden aangeroepen, en<br />

soms geen één, terwijl ze niet tot null zijn gereduceerd. Als je product families wilt onderhouden<br />

met uitsluitend compilers, library tools, en linkers, (maar wel met een dian build natuurlijk), dan<br />

moet je welhaast gebruik maken van object libraries, en de gatherer van de linker.<br />

Het zal je opgevallen zijn dat ik de dominantie van Koala over een working-tree probeer over te<br />

nemen met dian build, in een poging Koala te beperken tot de Koala packages.<br />

Het Push Algoritme<br />

Push gaat sequentieel door de push-positions.<br />

Een <strong>voor</strong>beeld: de push-positions definiëren bij<strong>voor</strong>beeld de afhandeling van:<br />

1. <strong>control</strong>eren df files, eventueel folders maken.<br />

2. compileren idl files<br />

3. genereren test harnesses<br />

4. genereren Koala header files<br />

5. compileren Koala header files<br />

6. compileren van gewone c files<br />

7. verzamel libraries bijhouden<br />

8. samenstellen executables<br />

Push vraagt de outline (in de vorm van een index) van de sio folders van de current push-position.<br />

Vervolgens gaat push de index af en vraagt per sio folder de outline van de betreffende primary<br />

inputs en gaat die af. Alleen die primary files komen in aanmerking die behoren tot de outline van<br />

Pagina: 160 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

de dian van de derived folder, en tot de outline van de start dian. Push werkt met een merge<br />

algoritme, waarvan de sio files van de folder en de primary inputs van de outline de inputs zijn.<br />

● Een sio file zonder match wordt ge<strong>control</strong>eerd. Zijn primaire input file moet bestaan, en<br />

behoren tot de volledige primary source outline van de sio folder en anders vervallen de sio<br />

file en de bijbehorende output files.<br />

● Een sio file met match wordt ge<strong>control</strong>eerd. Alle file items in de sio file moeten kloppen met<br />

de werkelijkheid, anders wordt een script node opgezet en meteen afgevuurd<br />

● Een primary input file zonder match leidt ertoe dat de script node wordt opgezet en meteen<br />

afgevuurd.<br />

We zien hier een late vaststelling van de outlines van primary en secondary inputs. Voor software<br />

die deel uitmaakt van product families geldt dat veel derived input er de éne keer wel is en de<br />

andere keer niet of omgekeerd. Als je uitgaat van bestaande software uit een family en je maakt<br />

daaruit software <strong>voor</strong> een nieuw gezinslid, dan wil dat gaandeweg nog wel eens veranderen. Ook<br />

zullen er vaak –, dank zij de diversity –, minder derived files zijn, dan je zou verwachten als je kijkt<br />

naar de source files. De late vaststelling is een <strong>voor</strong>deel. Maar de late vaststelling is niet dermate<br />

laat, dat primary input files mogen ontstaan in de push-position waarin ze worden verwerkt, laat<br />

staan in eerdere push-positions.<br />

Het kan <strong>voor</strong>komen dat een primary input in file twee derived folders wordt gecompileerd, het<br />

algoritme moet dit toelaten. Ook kan het <strong>voor</strong>komen dat een primary source die binnen de outline<br />

van de start dian valt niet gebruikt wordt omdat hij buiten de outlines blijft van alle derived folders.<br />

Mijns inziens is een warning hier op zijn plaats.<br />

De object files van global public folders<br />

Normaal met het importeren van secondary input files wordt een ruime outline gebruikt en een<br />

gatherer die de selectie uit het aanbod verzorgt. Dit is vaak ook de build outline <strong>voor</strong> gpf files.<br />

Normaal horen alle idl files in gpf folders, samen met hun derived files. Nu deze files gebruikt<br />

worden in meerdere executables, ligt het <strong>voor</strong> de hand om dynamic shared libraries te gebruiken<br />

<strong>voor</strong> de opslag van object files.<br />

We willen natuurlijk geen object files opnemen die helemaal niet gebruikt worden, dat bezet maar<br />

flash en main memory op het target system. Nu zijn er onder Linux twee manieren om shared<br />

libraries te gebruiken: dynamic linking en dynamic loading. Waarschijnlijk is geen enkele vorm van<br />

automatische gathering mogelijk bij dynamic loading. Maar bij dynamic linking kies je <strong>voor</strong> een<br />

vorm waarbij op compile-time de references worden opgelost, al worden ze op runtime<br />

gerealiseerd. Je offert daarom mogelijk een COM eigenschap op.<br />

Voor dynamic linking moeten alle objects zijn verzameld in één of meer shared libraries. We kiezen<br />

<strong>voor</strong> één om zoek problemen te <strong>voor</strong>komen bij het binden van references. Dit gaat –,als het nodig is<br />

–, <strong>voor</strong>af aan elke uitvoering van de linker.<br />

Bij het maken van een installatiefile zou mogelijk de reference data uit de executables kunnen<br />

worden samengesteld om te gebruiken bij het samenstellen van de uiteindelijke dynamic shared<br />

library van de objects uit de gpf folders. Het variant type dat hierbij gebruikt wordt: “target<br />

televisie”. Voor TriMedia en Standby processor is misschien static binding nodig, gesteld dat daar<br />

geen dynamic libraries zijn geïmplementeerd. Variant type “target computer” moet daarin eventueel<br />

<strong>voor</strong>zien.<br />

Pagina: 161 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Een manuele methode zou in de basic dians kunnen worden bijgehouden. De gebruikte idl<br />

interfaces van de modules in notice worden door de programmeur geboekt in de betreffende base<br />

dian. Zo wordt een selectie van idl files expliciet toegevoegd aan de build outline. Ook deze<br />

informatie is mogelijk afhankelijk van het variant type “target televisie”. Op die manier is per target<br />

bekend welke idl files betrokken zijn. De idl outlines die zo verzameld kunnen worden in een file<br />

zijn een bijproduct bij het maken van de executable. Ze worden bij het samenstellen van de<br />

uiteindelijke dynamic library gebruikt als secondary input.<br />

Fase één secondaire inputs<br />

Een script node moet eerst opgezet worden, en kan dan pas vuren. Input files en outlines bij het<br />

opzetten:<br />

● De varianten file.<br />

● df files. Om de folders van de output files te selecteren. We nemen aan dat een sio file maar<br />

in één folder terecht mag komen, <strong>voor</strong> de meeste andere output files geldt dat ook. Om df<br />

files te achterhalen is er misschien een outline van df files nodig, waaruit de juiste wordt<br />

geselecteerd. Merk op dat de folders waarin output files komen niet hardcoded <strong>voor</strong>komen<br />

in het script van de node, maar uit de geselecteerde df file gehaald worden.<br />

● Het generatie tool zelf.<br />

● De outlines <strong>voor</strong> de secondary inputs<br />

Koala en bib<br />

Onze rigide build methode heeft een probleem met Koala. Koala genereert een header file die<br />

ingelijfd wordt in een c file. Dit moet net omgekeerd zijn. Voor onze build methode is dit fout.<br />

Koala moet een primary input file genereren waarin de andere file geïmporteerd wordt. Na de Koala<br />

push-position start de push-position van deze files. Precies die files die Koala in de betreffende<br />

derived folder achter laat worden gebruikt in Push. Daarom moeten juist zij de primary inputs zijn.<br />

De files zijn een subset die door het Koala engine zijn bepaald, aan de hand van compile time<br />

diversity. Als in plaats daarvan de c files zouden worden gecompileerd zou dat leiden tot veel fouten<br />

omdat de header file kan ontbreken.<br />

Waarschijnlijk is de huidige omkering een legacy optie van Koala en hebben NXP en CE jarenlang<br />

opgezien tegen de wijziging van een fout die misschien al in de vorige eeuw ontdekt werd. In een<br />

dual window televisie bij<strong>voor</strong>beeld komen veel components in tweevoud <strong>voor</strong>. Er is dan één<br />

component met twee instances. Voor iedere instance genereert Koala een header file <strong>voor</strong> een c file<br />

die behoort tot de component. De bijbehorende c file moet dus twee keer gecompileerd worden, één<br />

keer met de ene h file, en één keer met de andere. Het script <strong>voor</strong> de compilatie van een Koala<br />

module zou de name van de h file als een parameter moeten doorgeven aan de compiler, zodat die<br />

tenslotte ingevuld kan worden in het #include statement van de c file. Het script moet natuurlijk<br />

ook de name van het c programma selecteren uit de name van de header file. De omkering is, als ik<br />

mij goed herinner, slecht één van de fouten: in de c programma's wordt mogelijk verkeerd<br />

omgegaan met instance names. Tot aan mijn pensionering werd een omslachtige en onderhoudsgevoelige<br />

methode gebruikt om maar geen gebruik te maken van meerdere instances van een<br />

component. De c files konden hergebruikt worden, maar de cd files werden in tweevoud<br />

bijgehouden.<br />

Pagina: 162 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Koala is een build system van zichzelf, die een aantal output files van de vorige keer opnieuw<br />

inleest om aan de hand van gewijzigde input de wijzigingen door te voeren. Momenteel gebruikt<br />

Koala zijn eigen sio file, maar eigenlijk kunnen Koala en build er één delen. Eigenlijk hoeft build<br />

geen dependency list op te slaan omdat Koala er één gebruikt. De Koala build is niet te doen met<br />

Push, vandaar. Zo'n build in een build kunnen we in veel eenvoudiger vorm ook zien bij sommige<br />

linkers en archivers. We zouden ze bib kunnen noemen: build in build.<br />

Ook de test harness generator is een bib.<br />

Bib Coöperaties<br />

Pull make is mogelijk te implementeren als bib. De nodes in make worden tweemaal bezocht, <strong>voor</strong><br />

een activiteit. Eenmaal heen en eenmaal terug. De heenweg visite zou gebruik moeten kunnen<br />

maken van de outliner <strong>voor</strong> de primary sources, de terugweg visite benut outlines <strong>voor</strong> de secondary<br />

input files.<br />

Koala bepaalt bij een cd file de outline van id files en h files. De outliner zou die kunnen leveren.<br />

Een bib zou een alternatief <strong>voor</strong> sio files kunnen gebruiken. De sio file die push gebruikt zou dan<br />

slechts de fase één inputs bevatten.<br />

Globals<br />

Er is een centraal document waarin een aantal zaken vermeld zijn:<br />

● Variant types en een opsomming van hun varianten<br />

● File-types<br />

Build filetypes eisen soms een verfijning van de normale filetypes. Bij<strong>voor</strong>beeld: de h files<br />

die gegenereerd worden door Koala worden gerekend tot een filetype die een primary input<br />

is, terwijl de c file die een Koala module representeert slechts een secondary input is. Er<br />

moet een list zijn van Build filetypes. dians weten van hun files tot welk build filetype ze<br />

behoren.<br />

● Generatie tool<br />

Er moet een template zijn van zijn script node.<br />

● Push-position<br />

Bij een push-position horen een generatie tool, een primary input type, en een volgnummer.<br />

Het volgnummer bepaalt ook het sio subtype. Enige opties als: “altijd vuren”, “Tool als er<br />

niet gevuurd moet worden” en zo. Frivool is een lijstje generatie tools, ieder met een<br />

primary input type, en eventuele opties.<br />

● Binnen de NHSW tree kunnen restricties bestaan <strong>voor</strong> bepaalde typen secondary input files.<br />

• Een secondary file mag alleen gebruikt worden. als de primary file tot dezelfde<br />

component behoort. Restrictie: component.<br />

• Een secondary input file mag gebruikt worden als de primary input hoort tot het<br />

package. Restrictie: private<br />

Pagina: 163 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

• De secondary input file heeft geen restrictie: public.<br />

Scoop typen vormen een globale lijst.<br />

● We gingen ervan uit dat binnen de dian outliner een file referentie bestaat uit het paar (file<br />

name, dian). Voor id files en h files geldt bovendien dat ze vanwege de scoop waartoe ze<br />

behoren dat de component name en package name toegevoegd zijn aan het tuple. Dat is<br />

daarmee een goed idee <strong>voor</strong> alle files. Nu build filetypes kunnen afwijken van gewone<br />

filetypes, kunnen die ook het best aan het tuple worden toegevoegd.<br />

Dians <strong>voor</strong> buildgraph afbakening, overwegingen<br />

Dians zijn objecten die een aantal functies implementeren. De meeste functies retourneren een<br />

outline. Voor afbakening van een buildgraph kan de outliner vragen om een outline gegeven een<br />

bepaald filetype. Voor afbakening ten behoeve van secondary files kan de outliner vragen om een<br />

outline gegeven een bepaalde restrictie en een bepaald filetype. Ze retourneren outline indexen van<br />

de files die ze in notice hebben, en de outliner moet die samenstellen tot één geheel. In frivole<br />

oplossingen kunnen de basic dians ook een lijstje retourneren van andere dians. Ze kunnen het<br />

package retourneren waartoe ze behoren, en of ze private zijn of public. De meeste dians zijn basic,<br />

maar er zijn enkele speciale. Dians zijn bedoeld als een oase van standaardisatie in een NHSW tree<br />

vol legacy en verschillen tussen teams.<br />

In frivole oplossingen vormen basic dians een verzameling trees. Een tree bevind zich in een<br />

package, meerdere trees kunnen <strong>voor</strong>komen in een package. Een tree ontstaat omdat een dian een<br />

aantal anderen in notice heeft. Nog frivoler wordt het als trees trees in notice hebben, en dan <strong>voor</strong>al<br />

trees buiten het eigen package. De toppen van de trees in een package kunnen public zijn of private.<br />

Een dian uit een ander package mag public trees in notice hebben. In rigide oplossingen zijn basic<br />

dians niet gekoppeld. De top in een package is een entry dian. Een entry dian heeft df files in<br />

notice, en basic dians. In de folders die afgeleid zijn van de df files komen derived files terecht ten<br />

gevolge van de eigen primary input sources. Deze derived files zijn op hun beurt weer primary<br />

input, of zeer precies afgebakende secondary input, als gathering ontbreekt.<br />

Er zijn df dians. Die hebber derived folder files in notice. In rigide oplossingen hebben ze basic<br />

dians in notice. Die op hun beurt hebben de primary inputs in notice <strong>voor</strong> de derived files die in die<br />

folders moeten worden opgeslagen. In frivole oplossingen hebben ze trees van basic dians in notice.<br />

Let wel de notice wordt niet gebruikt <strong>voor</strong> de afbakening van de buildgraph, maar <strong>voor</strong> onderhoud<br />

van een derived folder.<br />

Er zijn start dians. Misschien is elke df dian ook een start dian. De outliner bepaalt via de<br />

substructuur die door de start dian afgebakend wordt wat de primary input outline is. Mogelijk<br />

speelt de start dian ook een rol in het afbakenen van secondary input outlining (zie de sectie over<br />

global public, en local public). In een rigide systeem hebben ze basic dians door de hele NHSW tree<br />

in notice, in frivole systemen hebben ze de toppen van trees in notice.<br />

In een frivole oplossing is de notice van dians verspreid over de hele verzameling dian files. Bij<br />

rigide systemen zijn ze geconcentreerd in enkele start en df dian files. Waarom frivool?<br />

● In een rigide structuur betekent een wijziging in de constellatie van dians in een package dat<br />

meerdere start en df dians moeten wijzigingen. In een frivole structuur wordt alleen lokaal<br />

gewijzigd.<br />

● In een rigide structuur: bij elke wijziging van de structuur wijzigt de start node, die wordt<br />

Pagina: 164 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

dus veel gewijzigd, en moet vaak overgedragen worden aan <strong>Climbexion</strong>, dus merge met de<br />

bijdragen van velen is gegarandeerd.<br />

Als de structuur frivool verspreid is over de dian files worden ook de wijzigingen verspreid<br />

over de files en hoeft merge minder vaak te worden gebruikt.<br />

● In een rigide structuur kan een wijziging binnen een package ook een wijziging van starters<br />

betekenen in andere packages.<br />

In een frivole structuur kan gezorgd worden <strong>voor</strong> stabiele entry-points in een package, zodat<br />

wijzigingen binnen een package geïsoleerd kunnen plaatsvinden. Ook overgangen binnen<br />

een package naar een ander stelsel entry dians kunnen zo georganiseerd worden dat teams<br />

elkaar niet blokkeren.<br />

● In een rigide structuur wijzigt Cunie een constellation binnen een package en loopt daarna<br />

de df en start dians na, of die ook gewijzigd moeten worden. Lagus maakt ondertussen een<br />

nieuwe starter of een nieuwe df dian aan, die gebaseerd is op de oude constellation. Beiden<br />

dragen hun wijzigingen ongeveer tegelijk over aan de transfer drawer. De kans dat dit<br />

gebeurt lijkt met de rigide oplossing veel groter dan met de frivole. De rigide oplossing lokt<br />

“Lagus & Cunie” uit.<br />

Waarschijnlijk initialiseert de outliner door een sessie node te maken <strong>voor</strong> iedere dian. In de starter<br />

nodes en df nodes kan de buildgraph wordt vereenvoudigd tot outlines en opgeslagen. In de basic<br />

nodes kunnen alle pointers bidirectioneel worden uitgevoerd. Sessie nodes kunnen ook worden<br />

gebruikt om outlines, die reeds zijn bepaald, op te slaan <strong>voor</strong> later gebruik. Door goed te<br />

initialiseren is het <strong>voor</strong> een script node redelijk efficiënt om bij een primary input file een derived<br />

folder te vinden, en omgekeerd.<br />

De outline van alle primary inputs <strong>voor</strong> een target build moet zo precies mogelijk zijn, anders wordt<br />

er te veel gewijzigd. Outlines <strong>voor</strong> import in generatie tools mag vaak ruim zijn, de gatherer van het<br />

generatie tool lijft alleen in wat nodig is. Als een tool zo gebruikt wordt dat die altijd de hele outline<br />

van de input inlijft, dus zonder gatherer, dan moet de outline zo natuurlijk zo precies mogelijk zijn.<br />

Dat is de normale manier om met een linker om te gaan<br />

Ik weet niet of het <strong>voor</strong>komt, een derived file bij de ene df dian is primary input <strong>voor</strong> een folder in<br />

een andere. Als het kan kunnen mogelijk cross verwijzingen <strong>voor</strong>komen, en moet de outliner<br />

daarmee rekenen.<br />

Dians kunnen zich bevinden in een folder van het package of op afstand staan, of zelfs met<br />

meerderen in een file al dan niet op afstand. Deze implementatie details doen momenteel niet ter<br />

zake. Een feit is dat ze een aantal folders van een package in notice hebben met de files die er<br />

instaan. Ze bevatten een referentie naar die folders.<br />

Een package kan read-only zijn, in dat geval worden derived folders in het package beschouwd al<br />

source folder.<br />

Secondary input outlining<br />

buiten de primary input outlines van een starter dian. Misschien komt er een extra dian, de tree dian,<br />

die helpt bij het maken van public outlines van secondary input files. Ook komen er package dians,<br />

die de outline verzorgen van de public files, en de outline van de package restricted files.<br />

Pagina: 165 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

Basic dians in een package<br />

In plaats van het strikt volgen van de componenten structuur van Koala is een structurering binnen<br />

een enkele entry dian mogelijk, waardoor en maar één is per public component, één per test harness<br />

één per tool, indien daar source van zijn. De primary input dian heeft dan een lijst van de<br />

componenten in notice, waar Koala een tree heeft. Per component zijn dan speciale vermeldingen<br />

mogelijk, zoals c files die niet door Koala gebruikt worden en zo. De dians die hij in notice heeft<br />

zijn dan dians in een ander package, of df dians in eigen package. Er is natuurlijk wel enig risico om<br />

hier één per package van te maken, gegeven de discussie over rigide en frivole dian structurering.<br />

Een secondary source dian zou er kunnen zijn per package. Secondary input dians <strong>voor</strong> id, h, dd,<br />

files kunnen ver buiten folders van een primary input outline. Deze dian maakt deel uit van een<br />

structuur die overeenkomt met de structuur van de working-tree in dit geval een subset: een package<br />

tree.<br />

In een mixed tree omgeving zou een algemene outliner de specifieke van Koala kunnen vervangen.<br />

Voor Koala Componenten zou de outliner de Koala files kunnen gebruiken in plaats van de dians, of<br />

dians creëren uit Koala files. In packages zonder Koala zullen ze dan met de hand gemaakt moeten<br />

worden. Als een team ze niet mee levert bij een package, dan kunnen ze gemaakt worden in een<br />

folder die op afstand staat van het package. Een dian kan het entity type van een folder lezen. Dit<br />

type is reeds aanwezig in de kin. Hiermee “weet” een dian of de folder een interface folder is, of<br />

een koala component, of een com component, of wat <strong>voor</strong> entity type dan ook.<br />

Target directed df dian<br />

Sommige df folders zijn er <strong>voor</strong> executables. De primary inputs van de executable en van Koala<br />

moet zich bevinden in de primary input outline van de target df dian. Ook de df file <strong>voor</strong> de koala<br />

folder waarin die de header file plaatst, en mogelijk nog één <strong>voor</strong> de database die nodig is om<br />

wijzigingen door te voeren als Koala de volgende keer start, staan hier in notice. Om de executable<br />

up-to-date te maken moeten zij zich, samen met de df dian bevinden in de outline van de start dian.<br />

Opnieuw df files<br />

Derived folder files definiëren folders <strong>voor</strong> derived files. Deze folders bevindt zich samen met de df<br />

file in een gewone folder, tenminste als ze reeds bestaan.<br />

Van elke folder is gespecificeerd welke filetypes hij kan bevatten. Dit staat in de df file. Folders<br />

<strong>voor</strong> de opslag van sio files bevatten uitsluitend sio files.<br />

Secondary input outlining <strong>voor</strong> id, h, dd, pd, idl files kunnen de hele NHSW tree benutten. Ook de<br />

gespecificeerde folders ontvangen de outputs van de betreffende script nodes.<br />

Variant folders moeten mogelijk onderhouden worden. Welke varianten bij een folder moeten<br />

worden onderhouden hangt waarschijnlijk af van een generatie tool uit de push-position. Het<br />

generatie tool zelf kan een variant zijn, of minstens één van zijn input files kan een variant zijn.<br />

Afhankelijk van de varianten frivoliteit van de output files, moeten er een varianten folders worden<br />

gemaakt.<br />

De folders van een gewijzigde df file die betrokken is bij een build worden ge<strong>control</strong>eerd op op hun<br />

eigenschappen. Deugen filetype en push-position in de folders nog wel? Na een wijziging vervalt<br />

Pagina: 166 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.6 Builds en Repositories<br />

alles in de folders dat niet voldoet aan de specificaties, eventueel vervallen oude folders, nadat hun<br />

bruikbare inhoud is gekopieerd in de nieuwe.<br />

Eisen aan tools<br />

● Van een tool wordt verwacht dat die zijn dependency list kan produceren, dat zijn gatherer<br />

dit lijstje maakt. Bij <strong>voor</strong>keur met version informatie.<br />

● Als een tool een variabele aantal output files produceert, Dan wordt verwacht dat die zijn sio<br />

file kan produceren. Bij <strong>voor</strong>keur doet elk tool dit. Bij <strong>voor</strong>keur met version informatie. De<br />

inputs in fase 1 van de script nodes hebben reeds een dependency list opgeleverd. Die kan<br />

worden toegevoegd aan de sio file van het tool.<br />

● Een tool moet <strong>voor</strong> zijn secondaire input gebruik maken van de outlines die door de outliner<br />

gemaakt worden. De rigide outliner levert outlines in de vorm van een index van files, Als<br />

een tool uit de outline kan breken, of geen raad weet met een geleverde outline dan zou de<br />

script node moeten <strong>voor</strong>zien in conversie. Mogelijk met behulp van de outliner, die<br />

misschien een lijstje folders kan leveren, in plaats van files.<br />

● Een tool dat een ernstige fout produceert moet een reset plegen. De output files die<br />

overschreven zijn, of die zijn vervallen moeten in oude staat hersteld worden. De fout moet<br />

adequaat worden doorgegeven aan script en push in uitvoering. Als reset niet goed is dan<br />

moet ieder geval het adequaat doorgeven op orde zijn, zodat output files en sio file kunnen<br />

vervallen.<br />

Tot slot.<br />

Al met al lijkt er met push en dians een build mogelijk waarmee midl, Koala, Harness generator en<br />

home-made generatie tools uitgevoerd kunnen worden, en waarmee gemengde oplossingen<br />

mogelijk zijn, dus Koala packages en non Koala packages zijn te combineren, omdat hun derived<br />

files, bij<strong>voor</strong>beeld de object files, gescheiden kunnen worden opgeslagen. Start dians <strong>voor</strong> één<br />

enkele executable zijn er <strong>voor</strong> programmeurs. Start dians <strong>voor</strong> meerdere executables zijn er <strong>voor</strong><br />

build managers en programmeurs, en lijken te kunnen wedijveren met clean builds. Wel eist iedere<br />

variant combinatie zijn eigen build. Het zelf reinigende vermogen van het geschetste push algoritme<br />

en het gebruik van df files zou volledige clean builds moeten <strong>voor</strong>komen.<br />

Pagina: 167 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

2.7 Security<br />

Het <strong>revision</strong> <strong>control</strong> system sluit aan bij de security van de server waarop iemand is ingelogd. De<br />

user-id die daarbij gebruikt wordt is de sleutel die toegang geeft tot het <strong>revision</strong> <strong>control</strong> system en<br />

die bepaald wat iemand mag zien en wat iemand mag bewerkstelligen. Een user kan behoren tot één<br />

of meer teams, werkzaam zijn in één of meer projects, en verscheidene rollen vervullen.<br />

2.7.1 Security entiteiten<br />

Rollen:<br />

● Administrator: Zij of hij registreert clients, teams, projects, users, packages, locations, pools,<br />

drawers en hun samenhang<br />

● Build manager: Deze beheert de inhoud van drawers en constellations, plaatst elements in<br />

centers vanuit transfer drawers, importeert, en exporteert.<br />

● Developer: Zij/hij bezit (create/delete/empty) één of meer satellites van de team-drawer, en<br />

een location <strong>voor</strong> pools en drawers.<br />

● Tester: bezit één of meer satellites van de test drawer, en mogelijk ook van de team-drawer,<br />

en een location <strong>voor</strong> pools en drawers<br />

● Architect developer, architect tester: kan ook de attributes van kins onderhouden.<br />

● Integrator: bezit één of meer satellites van de team-drawer, en mogelijk ook van de mergeimport<br />

drawers en baseline-drawers, en een location <strong>voor</strong> pools en drawers<br />

● Guest: Een guest krijgt toegang tot sommige drawers, working-trees en info-trees. Ze mogen<br />

erin kijken. Niet alle guests krijgen dezelfde toegangsrechten. Afhankelijk van de export<br />

limitations die <strong>voor</strong> hen gelden krijgen ze toegang tot een bepaalde export-drawer, of ze<br />

mogen alleen bij een expose-drawer. Kijken en downloaden (exporteren) zijn hun<br />

mogelijkheden.<br />

● Project leader: Deze heeft mogelijk slechts indirect, via medewerkers toegang tot de<br />

repository, tenzij de project documentatie en de status reports worden opgeslagen in de<br />

repository, dan moet hij in ieder geval toegang hebben tot deze documenten.<br />

● Change manager: Deze gebruikt de repository <strong>voor</strong> project evaluaties, statistieken en zo.<br />

● Configuration manager: Deze benoemt en beheert de locations, pools, drawers en<br />

constellations, installeert <strong>Climbexion</strong>, en mogelijk het work-item system, en build system,<br />

import/export limitations en scripts en dergelijke.<br />

Organisaties:<br />

● Party: Een organisatie. We onderscheiden NXP, client, third party. De owner van een master<br />

project heeft de rol van client.<br />

● Team. Voor een team kunnen er export limitations gelden <strong>voor</strong> packages die in beheer zijn<br />

bij andere teams. Vaak is dit het geval als de teams behoren tot verschillende parties.<br />

● Project: Een tijdelijke organisatie waarin verschillende teams van verschillende parties<br />

participeren. Vaak is er een project leader per party (soms meerdere, als er veel soorten<br />

televisies ontwikkeld worden, of als een party meerdere producten (bij<strong>voor</strong>beeld chips)<br />

onderhoudt). We onderscheiden een master-project: het overall (software) project van de<br />

klant, en subprojects: waarin een deel van de software wordt opgeleverd. Het team in een<br />

Pagina: 168 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

Objecten:<br />

subproject behoort tot één party, en is verantwoordelijk <strong>voor</strong> een deel van de software.<br />

● Drawer: Hier<strong>voor</strong> gelden toegangsrechten van teamleden, afhankelijk van de rollen die ze<br />

vervullen. Voor leden van andere teams gelden guest rechten, die afhangen van de party<br />

waartoe het team behoort. De toegangsrechten bepalen ook de rechten op de files die tot de<br />

inner-reach van packages behoren, en de versions die tot de courses van de files behoren.<br />

Ook het satellite recht behoort tot de toegangsrechten., De sheets van patches die zijn<br />

aangebracht op de drawer zijn toegankelijk als de drawer toegankelijk is. De bij een patch<br />

behorende envelope is toegankelijk met de patch, en ook de envelopes die genoemd worden<br />

in de events van de courses van elements in de drawer zijn toegankelijk.<br />

● Package: de toegangsrechten zijn afhankelijk van het ownership, en van de drawer waarin<br />

het package zich bevindt.<br />

● Pool: <strong>voor</strong> versions, kins, envelopes zijn er de pools, met toegangsrechten tot een pool<br />

kunnen beperkingen plaatsvinden van de files waartoe men inzage heeft.<br />

● Location: Waarin de pools staan <strong>voor</strong> de versions binnen packages, <strong>voor</strong> de kins binnen een<br />

package, <strong>voor</strong> de envelopes binnen een subproject, <strong>voor</strong> drawers. Een location representeert<br />

een organisatorische eenheid, zoals een persoon met satellites op een PC, of een team of een<br />

groep teams binnen een party, met center-drawers op een server, of in een cloud.<br />

● Files, Folders, Soft-links: Deze objecten kunnen geheimen bevatten, of ernaar verwijzen.<br />

2.7.2 Security doelen en middelen<br />

Te bereiken discretie. Party en team discretie.<br />

● Geheime algoritmes. Als de algoritmes in de software van een team een concurrentie<br />

<strong>voor</strong>deel opleveren, dan zal men ze soms geheim willen houden. Zo zal NXP bepaalde<br />

algoritmes niet in source vorm beschikbaar stellen aan klanten, of andere partijen in een<br />

master project. Soms implementeert NXP geheime algoritmes van klanten in zijn software,<br />

en mogen die algoritmen niet gebruikt worden in projects van andere klanten.<br />

● Actualiteit. Een team dat meerdere projects bedient, mag soms geen actuele gegevens,<br />

(requirements en change requests, problem reports, project states, test results, plans) lekken<br />

van het ene project naar het ander, bij<strong>voor</strong>beeld als er concurrentie of competitie bestaat<br />

tussen de projects. Een probleem dat gevonden is bij de één en ook opgelost moet worden<br />

bij de ander, mag dan geen verwijzingen naar de één bevatten. Dit beperkt de gegevens in<br />

bij<strong>voor</strong>beeld envelopes, referentie naar en citeren uit problem reports als comment in source<br />

code e.d. Voor <strong>Climbexion</strong> betekent dit dat niet méér informatie op een scherm verschijnt<br />

dan nodig is.<br />

In mijn <strong>voor</strong>beelden van envelopes vermelde ik “Client, Team en Project”, maar project is<br />

voldoende. Voor degenen <strong>voor</strong> wie het bedoelt is zijn dan team en client en master project<br />

bekend. Ook bevat een envelope herkomst informatie als referenties naar parallelle projects,<br />

en original en neighbor gegevens. Deze gegevens mogen niet getoond worden buiten de<br />

teams die het package beheren. In baseline reports moet daarom verwezen worden naar een<br />

work-item extractie die dergelijke gegevens niet bevat.<br />

● Way of working. Waarschijnlijk heeft dit geen directe invloed op <strong>Climbexion</strong>. De way of<br />

Pagina: 169 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

working die door één party vereist wordt kan uiteraard invloed hebben op de way of<br />

working van een team in het algemeen. Maar het is niet netjes om hier de competitie tussen<br />

parties te beïnvloeden door te lekken.<br />

Soms bestaat er competitie tussen projects zelfs van één client. In het verleden is het zelfs zo<br />

geweest dat Philips verschillende merknamen gebruikte, en dat die merken <strong>voor</strong>al elkaar op de<br />

markt beconcurreerden. Het niet aan <strong>Climbexion</strong> of NXP om de gegevens van het éne project te<br />

lekken naar het andere. Tussen de projects van een client kunnen soms hoogstens afspraken worden<br />

gemaakt over de verdeling van capaciteit.<br />

Anderzijds kan het zo zijn dat een client een aantal projects heeft lopen, bij<strong>voor</strong>beeld per<br />

marktsegment, of per regio, en dat uitwisseling van informatie (kruisbestuiving) gewenst wordt. Er<br />

zijn dus projects waartussen informatie uitwisseling integraal moet plaatsvinden, maar ook projects<br />

waarin teams niet prijsgeven of bepaalde oplossingen of probleem beschrijvingen uit het ene project<br />

zijn overgenomen in het ander project. We zullen het begrip "party"gebruiken: als master projects<br />

tot dezelfde party behoren wisselen allen gegevens integraal uit, maar als master projects tot<br />

verschillende parties behoren, dan wordt het uitwisselen van informatie beperkt en blijft binnen de<br />

afzonderlijke teams. Gegevens over een wijziging in een package beperken zich dan tot de teams<br />

die het package beheren.<br />

Stel je eens <strong>voor</strong> dat de laatste hobbel die genomen moet worden om van <strong>Climbexion</strong> het<br />

wereldwijde standaard systeem te maken <strong>voor</strong> het opslaan van TV software, dat dat het<br />

beveiligingssysteem is. Dan moet de verlangde discretie overtuigend bereikt worden. Ik vond een<br />

artikel van Dorothy E. Denning: “A Lattice Model of Secure Information Flow”. Communications<br />

of the ACM May 1976, Volume 19 number 5. Er komt een fase in het ontwerp waarin het datamodel,<br />

de processen en de menselijke rollen volledig in kaart zijn gebracht. Dan moet dit Lattice model<br />

gemaakt worden en tonen dat de discretie en geheimhouding gewaarborgd is. Hopelijk is een<br />

statisch model voldoende <strong>voor</strong> de data entiteiten. Dan moeten er nog waarborgen komen dat de<br />

repository uitsluitend integere climbexion software gebruikt, dat de mensen die <strong>Climbexion</strong><br />

gebruiken zijn wie ze zeggen dat ze zijn, dat het niet mogelijk mag zijn om van buiten af<br />

waarnemingen te doen omtrent data in het <strong>revision</strong> <strong>control</strong> system of in de communicatie tussen de<br />

processen. Dat er dergelijke eisen aan zo'n systeem worden gesteld in een situatie waarin “trade<br />

secrets” worden gebruikt is normaal: degene die recht heeft op een geheim, moet soms kunnen<br />

aantonen dat het geheimhouden beveiligd was, en dat er “inbraak” nodig was om te komen tot een<br />

schending van het geheim. Waarschijnlijk behelst het totale lattice niet slechts de classificatie van<br />

files, maar ook die van drawers, pools, packages en dergelijke.<br />

Een repository is niet een alles omvattend systeem, en dat geldt ook <strong>voor</strong> de beveiliging van het<br />

systeem. De tralie van Dorothy Denning betreft de repository elements waaraan security classes<br />

worden toegekend. Waarschijnlijk worden mensen dynamisch gebonden. Ze zijn dan tijdelijk een<br />

entity waarheen, in een transaction informatie stroomt, die mogelijk na bewerking weer<br />

teruggevoerd wordt naar de repository. De classificatie van de terug te geven elements is dan de<br />

mogelijk de kleinste bovengrens van betrokken geraadpleegde elements. Mogelijk is <strong>voor</strong> zo'n mens<br />

een boven-grens gedefinieerd van de classificaties die <strong>voor</strong> haar/hem toegankelijk zijn. Verder reken<br />

je op haar of zijn discretie.<br />

Een build procedure is een process entity waarheen versions van geclassificeerde elements kunnen<br />

stromen, en die dan een resultaat leveren dat lager is geclassificeerd dan het supremum van de<br />

inputs. Immers de geproduceerde binary wordt geacht de geheimen te verbergen, die in de source<br />

Pagina: 170 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

files aanwezig zijn. Dit is faliekant in tegenspraak met de worst case aanname dat het opgeleverde<br />

resultaat de betreffende geheimen onthult, aan ieder die er toegang toe heeft, en dus het supremum<br />

als classificatie moet hebben. Er zal dan ook af en toe ingegrepen moeten worden op zo'n rigoureus<br />

geautomatiseerde beveiliging.<br />

Als je wilt komen tot een verfijnd systeem van export limitations middels een classification<br />

methode, dan is er een periode, na het opstarten van het project, dat de classifications niet op orde<br />

zijn. Gedurende die periode mogen alleen ingewijden toegang hebben tot de repository.<br />

Naast al deze eisen aan <strong>Climbexion</strong>, is er nog een middel dat gebruikt wordt. Een TV fabrikant kan<br />

NXP vereenvoudigde of oudere packages ter beschikking stellen. De werkelijke status van zijn<br />

software is dan niet bekend binnen NXP. Dit kan ten koste gaan van het vermogen om fouten te<br />

reproduceren en op te lossen. Voor <strong>Climbexion</strong> zou dit betekenen dat niet iedere baseline van iedere<br />

package in een master project beschikbaar is <strong>voor</strong> iedere party.<br />

Een vergelijking van export limitations ten opzichte van verouderde packages:<br />

Onderwerp Export limitations Oud package<br />

Onderhoudbaarheid Simpel ??<br />

Review op package Ingewijden Ingewijden<br />

Testen van product Allen Ingewijden<br />

Fout reproduceren Allen Ingewijden<br />

Fout analyse na product-test Soms allen, soms ingewijden Ingewijden<br />

Het gebruik van een dergelijk substituut is in wezen niet aan te bevelen omdat de independent<br />

deployment van Szyperski niet bereikt is. Het was in ieder geval nog niet bereikt toen ik<br />

gepensioneerd werd. Anno 2008 moest de software van NXP nog steeds getest worden met de tv en<br />

software van een klant. NXP zou dat zelf moeten kunnen doen. In ieder geval zouden ze een fout<br />

zelf moeten kunnen reproduceren en analyseren.<br />

Het one-roof gebeuren stelt specifieke eisen aan de discretie: ieder team kan beschikken over kennis<br />

die men niet wil delen met leden van een ander team, maar de leden zitten soms wel quatre main<br />

achter één display met toetsenbord. Ik weet niet hoe je onder die omstandigheden discretie<br />

waarborgt met functionaliteit van software. Voor <strong>Climbexion</strong> ga ik dit niet oplossen.<br />

Herkomst garantie<br />

Als teamlid Lepus een wijziging aanbied, dan wil je zeker weten dat het inderdaad teamlid Lepus is<br />

die de wijziging stuurt. De changesets en versions in een envelope zullen worden <strong>voor</strong>zien van een<br />

content hash. Versleuteling van de hash met haar private key, en <strong>control</strong>e met haar public key<br />

moeten waarborgen dat de wijziging inderdaad van Lepus afkomstig is. Elke transfer van een<br />

envelope kan uitgevoerd worden door een andere persoon, en zal een andere versleuteling van de<br />

hashes betekenen. De envelope waarmee een te exporteren baseline is gerealiseerd moet zichtbaar<br />

en verifieerbaar zijn <strong>voor</strong> degene die importeert. Voor external envelopes geldt hetzelfde.<br />

Waarschijnlijk worden public keys geregistreerd door administrators die ze via vertrouwde kanalen<br />

verkrijgen, die daardoor de rol van waarborg krijgen. De administrator database speelt hier een<br />

belangrijke rol.<br />

Pagina: 171 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

Database garantie<br />

Als je inlogt op een center-drawer, dan moet het gewaarborgd zijn dat je inderdaad inlogt op de<br />

betreffende drawer. Inloggen doe je via de administrator database, die je in verbinding brengt met<br />

het betreffende drawer. Ook van envelopes moet gewaarborgd worden dat ze zijn die ze zijn. En<br />

verder moet de administrator database zelf een toppunt van vertrouwen zijn. Niets mag fake zijn,<br />

alle inhoud van een database moet via een regulier en vertrouwd process zijn aangebracht. Ook de<br />

integriteit van de courses, de versions, de drawers en packages kan waarschijnlijk met<br />

(cryptografische) checksums en elektronische handtekeningen worden gewaarborgd. Ik denk dat<br />

hier<strong>voor</strong> aardig wat beveiligings-techniek komt kijken. In het begin van <strong>Climbexion</strong> is mogelijk nog<br />

niet alles beveiligd.<br />

2.7.3 Gentlemen agreements<br />

Er zijn een aantal afgesproken regels die niet echt of volledig afdwingbaar zijn met<br />

beveiligingssoftware. Overtreding van dergelijke overeenkomsten kunnen partijen of projects in<br />

problemen brengen. Discretie is er één. Niet wijzigen in de software van een ander is er ook één.<br />

<strong>Climbexion</strong> is waarschijnlijk niet in staat, om overtreding van zo'n overeenkomst onmogelijk te<br />

maken. <strong>Climbexion</strong> moet natuurlijk wel zo gemaakt worden, dat het mogelijk is om je aan de<br />

agreements te houden, of zelfs dat overtreding niet wordt uitgelokt.<br />

De baseline supplements discipline:<br />

De owner van een package is de enige die de patch uitgeeft.<br />

Dit moet onder andere <strong>voor</strong>komen dat lokale wijzigingen in andermans packages tot gevolg hebben<br />

dat nieuwe baselines van een package niet meer kunnen worden ingevoerd, of dat een team niet<br />

langer aansprakelijk kan zijn <strong>voor</strong> de werking van zijn package in een project. Nu er local pools<br />

bestaan is er niets afdwingbaar. De discipline zou als volgt ondersteund kunnen worden met<br />

security middelen: kins en versions kun je slechts gebruiken en importeren maar niet maken in een<br />

package waarop je geabonneerd bent maar dat je niet beheert. Maar op het moment waarop iemand<br />

een patch <strong>voor</strong>bereid <strong>voor</strong> een package van een ander team, dan zou de security toch omzeild<br />

moeten worden, of zou er buiten <strong>Climbexion</strong> om moeten worden uitgewisseld. Dat laatste is<br />

natuurlijk niet de bedoeling: <strong>Climbexion</strong> is er immers <strong>voor</strong> de uitwisseling.<br />

Export limitations:<br />

Deze worden gebruikt als een krakkemikkige methode om algoritmen geheim te houden. De<br />

gedachte is dat broncode noodzakelijk is om het geheim te leren kennen. Er is natuurlijk wel iets<br />

prijsgegeven: er is bij<strong>voor</strong>beeld een brochure waarin de loftrompet wordt gestoken over het<br />

algoritme, en er is gedocumenteerd hoe het algoritme geïntegreerd en geïmplementeerd moet<br />

worden. Met “reversed engineering” technieken zijn de algoritmen mogelijk toch te achterhalen. Er<br />

zijn zeer expliciete methoden:<br />

● Zo kun je de beschikbare software inbedden in een test-harnas en testen, om te achterhalen<br />

hoe ze werken.<br />

● Het doel van “machine code” is om een taal te maken die gemakkelijk is <strong>voor</strong> computers,<br />

maar niet om een taal te maken die onmogelijk is te lezen <strong>voor</strong> mensen: er zijn dan ook<br />

disassemblers die helpen bij het leesbaar maken van machine code.<br />

Deze methoden zijn inderdaad omslachtiger dan het gebruik van broncode. Verder moet je als je<br />

soortgelijke broncode wilt vervaardigen een ontwikkelingsproces volgen, dit is zeker omslachtiger<br />

dan het kopiëren van kant en klare broncode: bescherming tegen domweg kopiëren lijkt<br />

Pagina: 172 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

gewaarborgd , maar het beschermen van uitvindingen en ideeën niet.<br />

Het lijkt erop of software octrooien uit de gratie raken en dat <strong>voor</strong>al auteursrechten gaan gelden<br />

<strong>voor</strong> software. Dit is een ontwikkeling die rond de eeuwwisseling nieuw was <strong>voor</strong> chip en set<br />

makers: hardware octrooien zijn normaal, en met software octrooien lijken er altijd problemen te<br />

zijn. Vermoedelijk is het geheimhouden van algoritmes van korte duur, je profiteert in nieuwe<br />

televisies een half of een heel jaar van een nieuw algoritme, of een noviteit, en daarna wordt de<br />

implementatie geëvenaard of overtroffen door jezelf en de concurrentie. Misschien wordt dit de<br />

trend: je houdt software algoritmen een tijdje geheim en nadat je iedereen ermee verrast hebt maak<br />

je er GPL software van.<br />

Problemen met rechten op embedded software werden tot in de jaren negentig vaak vermeden. De<br />

software was er <strong>voor</strong>namelijk <strong>voor</strong> de gebruikers interface. Software werd (en wordt) “gratis”<br />

weggegeven bij de verkochte chips. In de praktijk was men er vaak guller (officieel: slordiger) mee,<br />

dan volgens het officiële beleid. De simpele gebruikers interface is inmiddels uitgegroeid tot<br />

“applicaties” en ook vervangt software hardware. De kosten van ervan zijn gigantisch geworden en<br />

de hoeveelheid chips of televisies met dezelfde software uitgave zijn kleiner geworden. Kortom<br />

software is geen weggevertje meer. De prijs ervan is nu significant aanwezig in de prijs van een<br />

televisie of in de prijs van een chip.<br />

Voor mensen is expertise en communicatie belangrijker dan broncode om zich een idee te vormen<br />

omtrent de algoritmen. Pas <strong>voor</strong> de laatste details is soms broncode nodig (of reversed<br />

engineering). Bij<strong>voor</strong>beeld, goed en kwaad leer je niet uit het wetboek van strafrecht (de broncode),<br />

maar je verwerft expertise door middel van communicatie en na-apen (de opvoeding). Misschien<br />

moet je je soms wel verdiepen in de details van een stukje wet. Voor zo'n wetboek gelden allerlei<br />

regels en gebruiken die we zullen samenvatten met de opmerking dat het “een wetboek” moet zijn.<br />

Door je kennis soortgelijk in “wetboek” fragment te gieten, lijkt het al een beetje op het echte<br />

wetboek fragment. Gaten en leemten zijn mogelijk meteen duidelijk. Door je eigen (denkbeeldige)<br />

stukje wetboek onbetrouwbaar te achten kun je een plan maken van de details die je wilt verifiëren<br />

(dit zijn gerichte of “gesloten” vragen). Als je niet beschikt over een wetboek, maar wel over een<br />

database met gerechtelijke uitspraken, dan kun je toch veel details achterhalen, die je denkbeeldige<br />

stukje wetboek verbeteren, tot niemand meer een verschil merkt met het echte. Je zou de methode<br />

kunnen noemen: van raden naar weten.<br />

Ik heb zo'n methode dikwijls gebruikt om me snel in te werken in een project. En vaak bij het<br />

analyseren van fouten of het vermijden van regressie: eerst bepaal je hoe je denkt dat het gedaan is,<br />

of desnoods hoe je iets zelf zou doen of maken: je gebruikt reeds verworven expertise. Dan test, kijk<br />

en vraag je hoe het gedaan is. Eerst vul je leemten in je kennis, dan verifieer je je kennis. Alles wat<br />

<strong>voor</strong>handen is en iedereen die beschikbaar is is potentieel bruikbaar. In alle beschikbare<br />

informatiebronnen ga je gericht en systematisch zoeken naar de informatie die je nodig hebt. De<br />

methode is niet zonder gevaren: immers je begint met een <strong>voor</strong>oordeel, en misschien heb je niet het<br />

inzicht om te weten wat je niet weet. Voor “eye openers” is het daarom aan te raden om ook meer<br />

open vragen te stellen, en zeker ook om te communiceren met anderen. Voorbeeld van een open<br />

vraag: “hoe zou jij het doen?”.<br />

Pagina: 173 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

Kern van de methode is waarschijnlijk de verbeelding, waarmee je de <strong>voor</strong>stelling creëert waaraan<br />

je gaat werken, tot die de werkelijkheid benaderd.<br />

Export limitations worden gebruikt in organisaties met engineers van mijn slag, en de meesten zijn<br />

vaardiger, nieuwsgieriger, slimmer en beter opgeleid dan ik, in teams die veel expertise delen,<br />

immers in elke party is veel TV kennis.<br />

In een project waarin de software gemaakt, geanalyseerd en verbeterd wordt, en waarin dergelijke<br />

activiteiten moeten worden verdeeld onder de deelnemers is het vaak onvermijdelijk dat mensen<br />

zich een beeld vormen, – soms zelfs een gedetailleerd beeld –, van niet openbare algoritmen,<br />

immers ook die kunnen de schuld krijgen van een fout, of behulpzaam zijn bij het vinden van een<br />

fout.<br />

Minimale protectie, maar ietsje meer dan niets.<br />

In de stad waar ik woon, was vroeger een grasveldje met een bordje: “verboden op het gras te<br />

lopen”. Het grasveld was omgeven door een twintig centimeter hoog hek, zodat je wist wanneer je<br />

de overtreding maakte. Op snelwegen zie je dat veel asfalt is neergelegd, dat vervolgens<br />

afgeschermd is <strong>voor</strong> gebruik, door middel van een witte streep (??). Toen een overtreder bekeurd<br />

werd, werd zijn excuus “ik wist niet dat je kwaad werd” van tafel geveegd, maar toen iemand een<br />

bal van het gras haalde die een peuter er per ongeluk op geschopt had, rechtvaardigde de ernst van<br />

de calamiteit de overtreding.<br />

Export limitations zijn zo te implementeren dat ze maar iets hinderlijker zijn dan het bordje, het<br />

hekje, en de streep. Bij<strong>voor</strong>beeld door extra een ongelimiteerde export-drawer beschikbaar te<br />

stellen <strong>voor</strong> analyse en debugging, terwijl normaal met een gelimiteerde drawer wordt gewerkt. Als<br />

je kennis verwerft wordt je geacht te weten dat het een geheim betreft, en dat geheimhouding<br />

vereist is. Niet lekken is een gentleman's agreement. Gerealiseerde export limitations van zichzelf<br />

zijn niet erg duidelijk in het markeren van geheimen, immers de geheimen worden juist niet<br />

gepubliceerd. In de ongelimiteerde export-drawer zouden de geheimen goed gemarkeerd moeten<br />

worden, wat natuurlijk ook een risico inhoud.<br />

Nu ik erover nadenk, geloof ik niet dat dergelijke minimale protectie werkt in de samenwerking<br />

tussen elektronica multinationals. Die willen toch iets roofdierachtigs uitstralen iets van “lean and<br />

mean”. Zo'n regeling vinden ze geschikt <strong>voor</strong> watjes.<br />

Beschikbaarheid nadat het project beëindigd is:<br />

Voor evaluaties, <strong>voor</strong> het vermijden van regressie, misschien wel in juridische conflicten, en<br />

mogelijk zelfs <strong>voor</strong> de wetenschap is het van belang dat langdurig beschikt kan worden door alle<br />

betrokken parties, – en misschien soms zelfs door buitenstaanders –, over het ontwikkel traject van<br />

software in beëindigde projects. Hiertoe moeten afspraken gemaakt worden door parties over het<br />

gebruik van “original storage” waarin de packages, projects en subprojects worden bewaard. Het<br />

moet minstens “niet eenvoudig” zijn om original storage te vervalsen, zodat er een certificaat is<br />

<strong>voor</strong> de juistheid der historie, en het moet (politiek?, juridisch?, organisatorisch?) onmogelijk zijn<br />

om eigenmachtig original storage af te sluiten, of te vernietigen, of beschikbaar te stellen aan<br />

derden buiten de gemaakte afspraken om.<br />

Pagina: 174 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.7 Security<br />

Maintenance afspraken:<br />

Tot de afspraken in de vorige categorie behoren de maintenance afspraken. Onderhoud is meestal<br />

nodig bij “field calls”. Bij<strong>voor</strong>beeld als er compatibiliteitsproblemen zijn met een specifieke zender<br />

of een specifieke dvd speler of zo. Meestal duurt het onderhoudscontract, tot er een opvolger is van<br />

de TV, binnen de garantie periode wordt een field call dan opgelost door de slachtoffers de opvolger<br />

aan te bieden. Onderhoudscontracten hebben enkele smaken, bij<strong>voor</strong>beeld:<br />

● De party die eigenaar is van het package verzorgt het onderhoud nadat het project is<br />

beëindigd. De party levert expertise <strong>voor</strong> het herleiden van een probleem tot een oorzaak,<br />

wijzigt indien nodig eigen packages, voert er tests over uit, en brengt patches uit.<br />

● De party die eigenaar is machtigt een andere party, – mogelijk die van het master project –,<br />

om het onderhoud van de packages te verzorgen. Misschien levert de eigenaar (incidenteel)<br />

expertise. Deze optie zou strijdig kunnen zijn met het idee van discretie. Immers degene die<br />

een package onderhoudt heeft de beschikking over alle package variëteiten in alle<br />

subprojects waarin het package is gebruikt, ook die van concurrenten. Voorlopig komen<br />

hier<strong>voor</strong> geen faciliteiten binnen <strong>Climbexion</strong>.<br />

Inner team security:<br />

Binnen een team heeft ieder lees-toegang tot center-drawers, envelopes, en dergelijke. Satellites zijn<br />

in principe slechts toegankelijk <strong>voor</strong> degene die ermee werkt, <strong>voor</strong> eigen evaluaties. Openbaar is<br />

echter de inhoud van de envelopes, maar die bevatten niet de history van de preparation state maar<br />

slechts het huidige resultaat. Dit komt overeen met de opvatting dat je iemand moet beoordelen op<br />

de resultaten, maar dat er enige privacy bestaat bij het realiseren van het het resultaat. Verder heb ik<br />

het liefst dat er gewerkt wordt met interactieve (Gui) climbexion add-ons, die de IDE uitbreiden,<br />

zodat wijzigingen definitief worden opgeslagen in de satellite als je op “save” drukt, en waarin<br />

mogelijk een “undo / redo” faciliteit komt, zolang je niet op “save” hebt gedrukt. Na save is de<br />

wijziging definitief. Je moet save natuurlijk niet eindeloos uitstellen: het is immers de bedoeling dat<br />

de course of development wordt vastgelegd, ook <strong>voor</strong> satellites.<br />

Pagina: 175 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

2.8 Overige aspecten<br />

2.8.1 Status en Progressie<br />

Het standaard status diagram van een element in <strong>Climbexion</strong> bevat de statussen: satellite, team,<br />

baselined. Bij een status hoort een kwaliteitsgarantie in de vorm van een regressie test en een scope,<br />

of wel een verspreidingsgebied, dat wil zeggen, de verzameling mensen die er normaal over<br />

beschikken. Daarnaast kan een status nog iets zeggen over het gebruik dat je van een element kunt<br />

maken. De standaard van <strong>Climbexion</strong>: Satellite, Team, Baselined, is de status die vanaf het begin<br />

wordt geïmplementeerd.<br />

Document status<br />

De architectuur van de software (we zullen architectuur hier opvatten als een aantal regels waaraan<br />

software en software ontwerpers moeten voldoen) eist bij public components en bij public<br />

interfaces een document, met een vastgelegde structuur. Dit is met name om semantische en<br />

pragmatische aspecten vast te leggen. Deze documenten, – en eigenlijk ook de interfaces en<br />

components die ze beschrijven –, doorlopen stadia. Ik meen dat dit het drietal: draft, exposed,<br />

accepted is. Voor interfaces is er nog de status obsolete, die is er om gebruikers aan te sporen om<br />

over te stappen op de opvolger; eigenlijk hoort hij in het rijtje niet thuis, omdat hij niet te maken<br />

heeft met kwaliteit, scope, en gebruik. Er is een tijd geweest dat er <strong>voor</strong> interfaces een folderstructuur<br />

bestond met de status namen, de folder “interfaces” omvatte in zijn memberset de folders<br />

“draft, en obsolete”, en verder de “accepted” files. Voor interfaces geldt een sterke binding tussen<br />

de status van het document en de status van de software: document en software worden gezamenlijk<br />

“in sync” bijgehouden. Voor components ligt het wat anders, als het document de status accepted<br />

bereikt dan kan het zijn dat de software nog gemaakt moet worden, maar soms is de software dan al<br />

klaar. Het gebruik en scope aspect is wel interessant, je kunt aan een document werken, je kunt het<br />

lezen, en je kunt het gebruiken (je implementeert de interface of component). De scope bestaat uit:<br />

de schrijver, een groepje reviewers en iedereen.<br />

Draft Exposed Accepted<br />

Schrijver Iedereen Schrijver Reviewers Schrijver Iedereen<br />

Werken aan: X X X*) X**)<br />

Lezen X X X X X X<br />

Gebruiken X X X X<br />

*) Indirect: de schrijver brengt de wijzigingen daadwerkelijk aan.<br />

**)Interfaces mogen niet gewijzigd worden, ze mogen slechts opgevolgd worden.<br />

Merk op: de draft status, die <strong>voor</strong> iedereen de komst van een component of interface aankondigt.<br />

Vaak wordt dit opgevat als: “gebruik <strong>voor</strong> eigen risico”. Oorspronkelijke betekenis: “ten behoeve<br />

van inspraak en planning: alleen <strong>voor</strong> informatie”.<br />

Interessant is de scope van exposed: Er is niet een vast team van reviewers, maar het groepje wordt<br />

adhoc samengesteld. Eigenlijk komt exposed nog het meest overeen met de envelope status<br />

“transferred”, waarbij gekeken wordt of de versions een build en een test doorstaan. Bij exposed<br />

Pagina: 176 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

wordt soortgelijk gekeken of een document een inspectie doorstaat.<br />

In de teams waarin ik werkte werd het review gebeuren als belastend ervaren. Architecten konden<br />

erin verzuipen, en ook anderen die zich naast hun eigen problemen en hun eigen competentie gebied<br />

ook nog eens intensief moesten inwerken in het werk van collega's konden de druk ervaren. De<br />

kwaliteits-officieren vonden dit onzin: een review hoefde toch maar een uur te duren: een half uur<br />

lezen, en een half uur praten. En daar hebben we ons toen maar aan gehouden. Toch kwam het soms<br />

<strong>voor</strong> dat reviews en inspections werden uitgesteld en uitgesteld, en iedereen met draft documents<br />

werkte. De kwaliteits-officieren hadden wel gelijk: in de status draft kan het document aan de orde<br />

worden gesteld in de meetings die architecten wekelijks houden, en kunnen mogelijk inhoudelijke<br />

wijzigingen worden aanbevolen; het review kan zich richten op zaken als duidelijkheid,<br />

volledigheid voldoen aan regels en dergelijke.<br />

Officieel werd gesteld dat na een wijziging (of een opvolging bij interfaces) de status weer draft<br />

moest zijn. In de praktijk werd het doorlopen van de toestanden slechts gedaan als een component<br />

of interface nieuw werd gemaakt, of bij aanzienlijke “delta processing” als het veel werk was om<br />

een component of interface over te nemen uit een <strong>voor</strong>gaand project. Daarna werd verondersteld dat<br />

er dermate zorgvuldig werd gehandeld dat de status “accepted” gehandhaafd bleef. In één enkel<br />

project was er dus sprake van progressie en zelden van cycli.<br />

Als <strong>Climbexion</strong> ooit is ingevoerd, moet maar eens bestudeerd worden of men <strong>voor</strong> verschillende<br />

typen files verschillende status en scope schema's kan implementeren in <strong>Climbexion</strong>, en of die dan<br />

gelden in plaats van de status-set satellite/team/baselined of ernaast, en of ze net zo dwingend<br />

mogen zijn met hun scope en sequence. Immers, we willen met <strong>Climbexion</strong> “gestructureerd<br />

samenwerken” mogelijk maken.<br />

Dan moet ook maar eens gekeken worden of er in <strong>Climbexion</strong> een opvolger relatie moet worden<br />

vastgelegd <strong>voor</strong> interfaces, of dat dit erbuiten geregeld wordt. (opmerking: een interface opvolging<br />

is geen “succession” de oude en nieuwe interface bestaan een tijd lang naast elkaar, en als alles<br />

volgens plan verloopt dan verdwijnt de oude op een gegeven moment). In ieder geval kun je<br />

eventueel een folder gebruiken om elkaar opvolgende interfaces te bundelen. Zeker nu een folder<br />

een entiteit parameter heeft.<br />

Certificaat tests<br />

Nadat een systeem is ingediend <strong>voor</strong> een certificaat-test mag het betrokken deel van de software<br />

niet meer gewijzigd worden. Indien de TV slaagt dan geldt dat nog slechts “serieuze fouten” mogen<br />

worden opgelost, en wel zodanig dat het keurmerk niet beschaamd wordt. Ook hier hebben we te<br />

maken met status overgangen, en een mogelijke terugkeer naar een <strong>voor</strong>gaande status. Ik heb geen<br />

informatie omtrent de precieze regels die gelden, of over regels die de afbakening van de<br />

gecertificeerde software regelen. Het eist dus nadere studie als <strong>Climbexion</strong> regels <strong>voor</strong> deze status<br />

moet faciliteren. De stadia zijn bij<strong>voor</strong>beeld: “preparation”, “evaluation”, “succeeded”. Een project<br />

zal dus zeer <strong>voor</strong>zichtig zijn met wijzigen van gecertificeerde software en hardware, en als een<br />

wijziging toch nodig is, intern de certificaat test uitvoeren.<br />

progressie<br />

Er zijn ook een statussen die zeer zeker niet cyclisch zijn.<br />

● De status van een (sub)project: de requirements- en <strong>voor</strong>bereidingsfase, ontwerpfase,<br />

Pagina: 177 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

development fase, integratie fase.<br />

● De status van het product, of de status van een package zoals vastgesteld door tests. In<br />

wezen wordt de status bijgehouden door het afvinken van de requirements lijst. Een <strong>voor</strong>af<br />

gedefinieerde mijlpaal wordt bereikt als een patroon van vinken gerealiseerd is. Je kunt tests<br />

en audits afvinken die doorstaan zijn. Stel een requirement is: het package zal CVBS<br />

signalen afhandelen. Afvinken kun je dan: het afhandelen van het CVBS signaal is de<br />

functionele test gepasseerd, de stretch test, de field test, de gebruikers test, of de certificaattest.<br />

De testers proberen ook nog uit of bepaalde functies testbaar zijn, en vinken ook af of<br />

een vereiste functie reeds is geïmplementeerd, maar eigenlijk zouden niet zij, maar de<br />

ontwikkelaars moeten rapporteren, of de functie al klaar is <strong>voor</strong> testen<br />

● De status van components en interfaces worden gedurende development fase (waarin<br />

nieuwbouw en delta processing plaatsvinden) ge<strong>control</strong>eerd, door een Pert network of Gantt<br />

chart bij te houden, van de geplande activiteiten. Deze geven dan de status aan die bereikt is.<br />

Wat geldt <strong>voor</strong> document stadia en certificaten geldt ook <strong>voor</strong> audits en mijlpaal overgangen: je<br />

mag daarna niet zodanig handelen dat het bereikte stadium een farce wordt.<br />

Naarmate de software voldoet aan meer requirements groeit ook de regressie test. Dit is één van de<br />

waarborgen dat een bereikt stadium gehandhaafd blijft. Een andere waarborg is dat bepaalde change<br />

requests niet meer worden gehonoreerd. Ook de wijze van software wijzigen zal op het laatst<br />

veranderen: men zal de wijziging minimaliseren, en dus niet gelijktijdig de software<br />

herstructureren.<br />

Het bereiken van een mijlpaal is reden <strong>voor</strong> een borrel. De bijdrage van <strong>Climbexion</strong>:<br />

● Mijlpaal documenten kunnen worden opgeslagen als “other-focused” files.<br />

● Het master project kan een drawer bijhouden waarin overall mijlpalen in geregistreerd staan.<br />

Het is de vraag of deze mijlpalen werkelijk een snapshot worden in team-drawers. Desalniettemin<br />

willen de teamleden wel hun feestje.<br />

2.8.2 Het top package<br />

De top van een drawer is een bijzonder package. Teams kunnen hun eigen top definiëren, of een top<br />

kan gemeenschappelijk zijn binnen een master-project. Testers kunnen mogelijk een andere top<br />

behoeven dan ontwikkelaars, met hun eigen package references. Tool leveranciers behoeven een top<br />

die toegespitst is op het tool. Kortom: waar teams nauw moeten samenwerken is een<br />

gemeenschappelijk gedefinieerde topstructuur gewenst, specialisten kunnen behoefte hebben aan<br />

een afwijkende structuur, en teams kunnen behoefte hebben aan een structuur met privé packages.<br />

Er zullen dus misschien meerdere top packages nodig zijn. Sommige kunnen uit elkaar <strong>voor</strong>tkomen<br />

met hulp van import limitations. Bij<strong>voor</strong>beeld testers gebruiken andere import limitations dan<br />

ontwikkelaars, op een gemeenschappelijk top package.<br />

Een top package in beheer bij een ander team dat bij ons vrij uitbreidbaar is met references naar<br />

eigen privé packages wordt niet echt gefaciliteerd. Privé packages kun je aanroepen vanuit eigen<br />

public packages en dan export limitations gebruiken.<br />

Opmerking: het top package representeert niet “het product” Er is een speciaal package <strong>voor</strong> het<br />

product.<br />

Van het top package mag mogelijk verwacht worden dat die de toppen van het Build Forest<br />

Pagina: 178 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

definieert, en dat die de cross references naar de global public folders bevat.<br />

Ik ga er maar vanuit dat het top package geleverd wordt door het master project, en met behulp van<br />

import en export limitations getrimd wordt <strong>voor</strong> drawers van subcontractors, en specialisten.<br />

2.8.3 Locks<br />

Transactions in databases moeten voldoen aan de ACID regels (zie Wikipedia).<br />

Lock mechanismen zijn nodig om ongewenste effecten van parallel updates, en van parallel update<br />

en retrieval te <strong>voor</strong>komen. Ze zijn een hulpmiddel om een transaction “geïsoleerd” aan te brengen,<br />

zodat als een transaction min of meer gelijktijdig met andere transactions, of met gelijktijdige<br />

requests de database benadert, dat dan <strong>voor</strong> de andere transactions geldt: of ze zien de database van<br />

vóór de transaction, of erna. Locks worden vaak gecombineerd met een rollback methode die<br />

er<strong>voor</strong> zorgt dat transactions atomair zijn zodat alle wijzigingen van een transaction worden<br />

aangebracht in de database, of geen één van alle.<br />

Expliciete locks zijn vaak te vermijden:<br />

● Satellites bij<strong>voor</strong>beeld, hebben over het algemeen één enkele gebruiker, die met één tool in<br />

één process de database benaderd. Haar of zijn opdrachten komen niet gelijktijdig, maar<br />

achter elkaar: er zijn geen effecten van parallel update<br />

● In een drawer wordt niets overschreven, maar alles wordt in een course geplaatst. Als de<br />

drawer wordt benaderd <strong>voor</strong> louter retrieval, op de tip, dan wordt eerst de timestamp gelezen<br />

van de laatste correct geëindigde transaction, en die wordt als snapshot gebruikt.<br />

Het mechanisme van de transfer-drawer zorgt dat envelope transfers in een rij gezet worden, en dan<br />

sequentieel afgehandeld. Dit is het meest basale principe van locking: een envelope transfer is in<br />

lock totdat hij aan de beurt is in de rij waarin hij staat. In een database zijn vaak meer verfijnde<br />

methoden gerealiseerd, waarbij verschillende transactions parallel kunnen worden afgehandeld,<br />

maar die zijn <strong>voor</strong> een repository mogelijk niet altijd nodig.<br />

Naast dergelijke interne locking, die vaak niet langer duurt dan enkele seconden, is er in veel<br />

<strong>revision</strong> <strong>control</strong> software nog een locking mechanisme dat uren of zelfs dagen kan duren, en die<br />

niet alleen interne processen blokkeert, maar ook mensen die iets willen wijzigen. Een<br />

geblokkeerde file kun je niet wijzigen, althans je kunt de wijziging niet in de betreffende drawer<br />

plaatsen. Behalve natuurlijk als je zelf de blokkade hebt ingesteld. Als je een wijziging wilt<br />

doorvoeren op een aantal files, dan moet je wachten tot er geen meer geblokkeerd is. Parallel<br />

updates en dus merging worden zo <strong>voor</strong>komen, maar mensen kunnen slechts wachten tot de lock<br />

<strong>voor</strong>bij is. Bord en kaartspelen zijn speciaal uitgevonden om dergelijke wachttijden door te komen.<br />

<strong>Climbexion</strong> implementeert dit niet, maar gaat ervan uit dat wijzigingen gebaseerd op snapshot A,<br />

gemakkelijk –, bijna automatisch -, gewijzigd kunnen worden in wijzigingen gebaseerd op<br />

snapshot B, zodat je niet op elkaar hoeft te wachten, maar alvast aan het werk kunt op een<br />

<strong>voor</strong>lopig snapshot. Langdurende locking is dus normaal niet nodig, ten koste van het meer keer<br />

aanbrengen van een wijziging, hetzij door merging, hetzij met de hand. We gaan er dus van uit dat<br />

alleen de eerste keer wijzigen langdurig werk is. En dat dit niet alleen geldt als een merge<br />

programma kan worden gebruikt, maar ook als je de wijzigingen met de hand moet integreren in<br />

andere version.<br />

Normaal zal de eis dat bij een transfer zowel de base version als de nieuwe version worden vermeld<br />

Pagina: 179 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

in de envelope, samen met een notificatie als files op meerdere plaatsen onderhanden zijn, en een<br />

eventuele onderling overleg, voldoende zijn om te <strong>voor</strong>komen dat parallel updates de consistentie<br />

verstoren. <strong>Climbexion</strong> <strong>control</strong>eert dan of de base version de tip is van de course die moet worden<br />

uitgebreid, en weigert envelopes als er geen match is met een uit te breiden tip.<br />

In ons team waren er bepaalde files die zeer frequent door iedereen gewijzigd werden. Dan viel het<br />

niet altijd mee om een envelope over te dragen. Het kon <strong>voor</strong>komen dat anderen je steeds <strong>voor</strong><br />

waren, en je een aantal malen moest instellen op een nieuwe base, (en een build uitvoeren ter<br />

verificatie). Ik meen dat zo'n situatie, waarbij je steeds opnieuw moet beginnen maar nooit het eind<br />

haalt, “starvation” (hongerdood) wordt genoemd. Een file die transfer competitie uitlokt kunnen we<br />

een “choke-point” noemen. De platform cd file, en de cd file van de platform diversity component<br />

zijn <strong>voor</strong>beelden. In de beschrijving van dians is er ook één bedacht. In de team-drawer zijn het de<br />

files met een excessieve lengte van de version course. Tussen de tien files met een de langste<br />

course zullen ongetwijfeld enige choke-points zitten.<br />

Starvation is een mooie term, maar eigenlijk was het zo dat je je ei maar niet kwijt kon.<br />

Ik ben natuurlijk geneigd om verwijtend naar de architecten te kijken, die niet een structuur<br />

bedacht hebben waarin dit soort files vermeden wordt. Maar aan de andere kant is het natuurlijk<br />

een uitdaging <strong>voor</strong> een tool-maker om hier een oplossing te bedenken. Zelfs als architecten een<br />

oplossing weten <strong>voor</strong> zo'n probleem, dan moet het zich waarschijnlijk eerst manifesteren, en is er<br />

een periode waarin <strong>Climbexion</strong> kan schitteren met een oplossing.<br />

Het blijft laveren tussen “ontwerpen is <strong>voor</strong>uit zien” en “de mensheid lijdt het meest aan 't lijden<br />

dat men vreest...”, tussen bedenken en bekijken, tussen rationalisme en fenomenologie. In software<br />

ontwikkeling is er mogelijk een tendens om <strong>voor</strong>al te <strong>voor</strong>komen, want de gelegenheid om te<br />

reageren op bedenkelijke fenomenen die zich in de software <strong>voor</strong>doen is er te vaak niet. Maar<br />

<strong>voor</strong>komen van zaken die later geen probleem blijken te zijn levert zelf ook rare constructies op. In<br />

ieder geval <strong>voor</strong> de geschetste starvation probleem geldt dat het niet <strong>voor</strong>komen werd.<br />

Anti-starvation.<br />

In zo'n situatie zou een lock op de file wel eens gewenst kunnen zijn. Als meerderen een lock zetten<br />

op een file, met vermelding van hun envelope, dan ontstaat er in feite een queue, een <strong>voor</strong>af<br />

bepaalde volgorde, waarin de envelopes mogen worden overgedragen. Als je envelope aan de beurt<br />

is baseer je de wijzigingen op het laatste snapshot, pleeg je de builds en geef je de envelope vrij<br />

<strong>voor</strong> transfer. Het is een oplossing die nieuwe problemen creëert: wat als de eigenaar van een<br />

envelope inmiddels in een vergadering zit of zo als zijn envelope aan de beurt is, dan houdt die de<br />

hele queue op. Er is dus waarschijnlijk extra communicatie en queue management nodig. Sommige<br />

envelopes zullen in meerdere queues zitten, dan kan de ene queue de andere ophouden, en zo zijn er<br />

nieuwe problemen die om een oplossing vragen. Ik denk dat we dit maar niet te snel moeten doen:<br />

locks op transactions, die interacties plegen met mensen.<br />

Zo'n probleem beschrijving als hierboven is wel ongeveer een introductie op een inleiding.<br />

De manier waarop dergelijke locks gedaan worden in databases (in twee fasen) is bij<strong>voor</strong>beeld<br />

beschreven in:<br />

C.P. Eswaran, J.N. Gray, R.A. Lorie, and I.L. Traiger: “The Notions of Consistency and Predicate<br />

Pagina: 180 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

Locks in a Database System ”; Communications of the ACM; November 1976 Volume 19 Number<br />

11 p 624-632. (In 1976 was de term ACID nog niet bedacht)<br />

De queues die ik gebruik zijn afwijkend ten opzichte van “The Notions of Consistency and<br />

Predicate Locks in a Database System ”.<br />

● In “The Notions ...” betekent de opdracht “lock” in een thread op een queue waarin<br />

<strong>voor</strong>gangers zitten ogenblikkelijk: “kom in een “wait state” totdat de <strong>voor</strong>gangers uit de<br />

queue zijn verdwenen, en vervolg dan de thread”. Ik ga uit van messages met een callback<br />

procedure, die aangeroepen wordt als de entry in de queue aan de beurt is. De thread die de<br />

message stuurt gaat gewoon door na het sturen.<br />

● In “The Notions ...” wordt expliciet de opdracht “unlock” gegeven, in de door mij geschetste<br />

methode betekent “return” van de callback procedure: “message verlaat de queue”.<br />

● Als je kiest <strong>voor</strong> een queue/lock per element, en je wijzigt de version, de name, en de folder<br />

reference, dan betekent dit in “the Notions ...” één lock <strong>voor</strong> alle wijzigingen, <strong>voor</strong> de<br />

message queues kan iedere wijziging een message zijn.<br />

● “Mijn” message queues zijn natuurlijk niet van mij. Ze zijn bij<strong>voor</strong>beeld beschreven in 1.4.8<br />

in de sectie “Pumps en pump engines”. Het is wel zo, dat ze identificeerbaar zijn met een<br />

willekeurige name (de kin id bij<strong>voor</strong>beeld). De meesten worden automatisch gecreëerd als<br />

de eerste message wordt toegevoegd, en verdwijnen automatisch als de laatste message is<br />

verwerkt. Maar sommigen worden expliciet gecreëerd, en vervallen expliciet, en mogen in<br />

de tussentijd messages bevatten of leeg zijn.<br />

● Een kin id wordt geacht uniek te zijn binnen een package. Als je hem gebruikt als<br />

queue/lock name dat betekent dit mogelijk een kleine vergroving van de granulatie van de<br />

queue/lock, als de kin id ook in gebruik is in een ander package. Het mogelijke parallellisme<br />

wordt nauwelijks aangetast.<br />

Nu er courses worden bijgehouden is het <strong>voor</strong> de isolation rule nodig dat als twee envelopes twee<br />

dezelfde files wijzigen, dat óf de ene (direct of indirect) gebaseerd is op de tips die de ander<br />

achterlaat óf omgekeerd, maar wat niet mag is dat de ene file eindigt met de tip van envelope één en<br />

de ander met een tip van envelope twee. De startfasen van de overdracht van aangeboden envelopes<br />

kunnen daarom het best één <strong>voor</strong> één af gehandeld worden, bij<strong>voor</strong>beeld met behulp van een<br />

“startfase queue”. De startfase (de locking fase) start nadat een envelope is aangeboden <strong>voor</strong><br />

overdracht, zodra die aan de beurt is in de queue. In de startfase worden de messages gestuurd naar<br />

element queues, met onder meer references naar de envelope en de callback procedure. De<br />

onderlinge volgorde van de envelopes in de startfase queue wordt ook de onderlinge volgorde in de<br />

queues van gemeenschappelijke elements, en wordt ook de onderlinge volgorde waarin ze de<br />

courses van de gemeenschappelijke elements uitbreiden. Daarom is de sequencing in de startfase<br />

queue reeds voldoende is: het vrijgeven van messages in element queues hoeft niet per se te<br />

wachten tot fase twee.<br />

Het is natuurlijk wel zo dat er ook nog een changeset moet worden bijgehouden. Een lege changeset<br />

zou je meteen in het begin van de startfase op de tip van het transaction element kunnen plaatsen,<br />

zodat een volgende transactie er ook één aan kan toevoegen. De invulling vindt dan plaats als de<br />

elements worden bijgewerkt.<br />

De locks die worden uitgevoerd zijn locks (en dus updates van queues) op kin id's (eventueel meer<br />

verfijnd: locks op de courses van elements). Er is dus in principe een queue per element (of per<br />

course van een element), <strong>voor</strong> de elements die op een zekere tijd betrokken zijn bij een overdracht.<br />

Pagina: 181 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

Er komt of er is een moment waarop er <strong>voor</strong> een envelope geen <strong>voor</strong>gangers zijn in een element<br />

queue. Dan moet soms een nieuw base/labored paar worden gemaakt door de indiener. Een element<br />

waar<strong>voor</strong> geen nieuw base/labored paar nodig is wordt vrijgegeven zodra er geen <strong>voor</strong>ganger is in<br />

de queue, en de tip van de betreffende course is bijgewerkt. Een element waar<strong>voor</strong> een nieuwe<br />

labored version moet worden gemaakt wordt pas bijgewerkt op de tip en vrijgegeven bij het<br />

beëindigen van de overdracht, nadat is merge is uitgevoerd, merge fouten verholpen, en builds<br />

foutloos zijn. Dit vrijgeven komt erop neer dat de message de element queue verlaat, zodat zijn<br />

eventuele opvolger aan de beurt kan komen.<br />

Over het algemeen zijn database transactions niet vrij van deadlocks. Deadlocks kunnen<br />

<strong>voor</strong>komen als een transaction aan de beurt moet zijn in meer dan één queue tegelijk. Per element,<br />

en dus per queue is er één actie, zodra de envelope aan de beurt is. Combinaties van queues waarin<br />

de envelope aan de beurt moet zijn <strong>voor</strong>dat iets mag gebeuren worden niet gebruikt, en zo'n<br />

combinatie is wel nodig <strong>voor</strong> een deadlock.<br />

Zonder startfase queue, had de transaction moeten wachten tot ze in alle element queues aan de<br />

beurt zou zijn, <strong>voor</strong>dat tips konden worden bijgewerkt. Omdat dan niet <strong>voor</strong>komen wordt dat de éne<br />

envelope aan de beurt is in de éne gedeelde queue en de andere in een andere gedeelde queue is<br />

deze methode, zonder verdere maatregelen, niet vrij van deadlocks.<br />

Enige aandacht is vereist <strong>voor</strong> het aanbrengen van tips in courses. De timestamps van course items<br />

bestaan mogelijk uit de datum/tijd van de start van hun envelope overdracht, en een event<br />

aanduiding, zodat deze altijd vroeger zijn dan de timestamp van de start van een volgende envelope.<br />

Het geschetste algoritme kan enigszins uitgebreid worden. In het begin, <strong>voor</strong>dat enige version is<br />

overgedragen kan de overdracht “gratis” (zonder rollback) gecanceld worden. Het zou een<br />

overdrachtsoptie kunnen zijn: als merge zou moeten plaatsvinden, cancel dan de overdracht, want<br />

dan probeer ik het later nog eens, nadat ik de satellite heb gesynchroniseerd met de tip van de<br />

transfer-drawer. (dit is de starvation situatie). Nadat hierop is ge<strong>control</strong>eerd, en er geen problemen<br />

zijn, kan een changeset worden geïnitieerd, en kunnen de betreffend queues worden worden<br />

uitgebreid. De <strong>voor</strong>ganger in de element queues moet hier<strong>voor</strong> geïnspecteerd kunnen worden:<br />

immers de labored version die eruit <strong>voor</strong>tkomt moet bekend zijn en overeenstemmen met een base<br />

version in de huidige envelope.<br />

De methode kent als beperking dat uitsluitend die files mogen worden gewijzigd waarvan<br />

<strong>Climbexion</strong> aangeeft dat een nieuwe labored version moet worden gemaakt in de envelope. Als er<br />

buiten de betreffende files moet worden gewijzigd, moet de overdracht worden gecanceld en moet<br />

een nieuwe overdracht worden <strong>voor</strong>bereid.<br />

Als het wijzigen van de drawer begonnen is, en er moet een merge plaatsvinden, dan is het toch wel<br />

een plicht om de overdracht tot een goed einde te brengen.<br />

Als je dan toch besluit om de overdracht te cancelen, dan betekent dit:<br />

● Eerst moeten ook alle erop volgende –, niet voltooide –, transactions tijdelijk gecanceld<br />

worden. Het is denkbaar dat dit verfijnd kan worden: transactions die een element delen met<br />

een uitgeschoten <strong>voor</strong>ganger, hun transaction moet ook gecanceld worden, maar wel<br />

tijdelijk. Dit is een soort olievlek effect.<br />

● Dan vindt rollback plaats. Dit herstel van de drawer is een soort transaction zonder<br />

envelope. In plaats van rollback stel ik het volgende <strong>voor</strong>: Elke tips die reeds was<br />

bijgewerkt door de uitgeschoten envelopes moeten uitgebreid worden door het juiste<br />

<strong>voor</strong>gaande course item opnieuw aan te brengen. Dergelijk herstel laat dus “littekens”<br />

Pagina: 182 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

achter in de drawer, die later gebruikt kunnen worden bij evaluaties van<br />

overdrachtsprocedures. Dit is niet zuiver “atomair”, en is een herziening van het “duration”<br />

principe qua ACID.<br />

● Daarna moeten alle tijdelijk uitgeschoten envelopes opnieuw overgedragen worden.<br />

Het blijft natuurlijk een probleem dat menselijke interactie is vereist bij de uitvoering van de<br />

transaction, en dat ze duurt totdat de indiener tevreden is met alle merge, rework en rebuild<br />

resultaten. De locks op de aan te passen elements duren daardoor lang, zelfs als de mens<br />

ogenblikkelijk beschikbaar is.<br />

Een optie kan zijn om bij de overdracht waarbij een merge moet plaatsvinden, om dan een niet<br />

interactieve merge unattended uit te laten voeren door de overdrachtssoftware. Alleen bij merge<br />

conflicten (of build errors) wordt overgegaan op een interactieve modus, of wordt de overdracht<br />

gecanceld. Indien gekozen wordt <strong>voor</strong> cancel, kunnen base versions in envelopes die na de<br />

uitgeschoten envelope komen hun match met een tip verliezen, waardoor ook deze envelopes een<br />

probleem hebben. Mocht deze methode over het algemeen goed verlopen, dan zou je kunnen<br />

besluiten om de laatste synchronisatie, die nu plaatsvindt vóór de overdracht, te laten plaatsvinden<br />

tijdens de overdracht.<br />

Enige aandacht is vereist <strong>voor</strong> het uitvoeren van een build. Het synchroniseren van satellite en<br />

working-tree, met de transfer drawer is hier geen trivialiteit.<br />

Voor merge is het voldoende als een envelope geen <strong>voor</strong>ganger heeft in de betreffende element<br />

queue. Voor het synchroniseren van een tree ten behoeve van build moeten de overdrachten van alle<br />

<strong>voor</strong>gaande envelopes voltooid zijn, dus de envelope zelf mag geen <strong>voor</strong>gangers hebben in een<br />

“synchronize queue”.<br />

De build zelf mag pas plaatsvinden als alle merge en synchronisatie klaar is in de betreffende tree.<br />

Niet alle transactions vereisen een build,en deze transactions verlaten de synchronize queue terwijl<br />

ze mogelijk nog <strong>voor</strong>gangers hebben. Het verlaten van de synchronize queue betekent het einde<br />

van de transaction en mag plaatsvinden als alle element queues zijn verlaten, en alle tips zijn<br />

bijgewerkt.<br />

Files die niet met een merge tool verenigd kunnen worden (bij<strong>voor</strong>beeld: documenten,<br />

spreadsheets, plaatjes), kun je overdragen in een envelope met de mogelijkheid van cancel in het<br />

begin. Als deze optie niet gekozen wordt dan geldt <strong>voor</strong> een dergelijke file dat ze alleen handmatig<br />

gewijzigd kan worden tijdens een transfer, dus niet unattended: er is immers geen merge<br />

programma. Ook geldt waarschijnlijk dat er op het eind geen build of extra verificatie nodig is.<br />

Meestal zijn dergelijke files niet de files die starvation of queuing veroorzaken. Het enige bezwaar<br />

met de interactieve methode zit hem in het verlaten van de synchronize queue als de transaction<br />

<strong>voor</strong>bij is, hierdoor kan een handmatige methode het uitvoeren van builds ernstig vertragen.<br />

Er zijn drie basis overdrachtsopties:<br />

● Eventueel cancelen in fase één (mogelijk starvation)<br />

● Interactieve merge, rework en build. (mogelijk langdurig ophouden van enkele queues)<br />

● Niet interactieve merge en build en cancel bij conflicten en fouten (mogelijk moeten<br />

envelopes opnieuw worden aangebracht, met alle problemen van dien wat betreft tip/base<br />

matchen).<br />

Deze opties hebben zo hun nadelen. Je kunt dit moeilijk “schitteren met een oplossing” noemen.<br />

Nog enige opmerkingen:<br />

Pagina: 183 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

● De messages in een queue kunnen het best in dezelfde thread afgehandeld worden, ze<br />

moeten immers toch successievelijk afgehandeld worden.<br />

● De startfase queue, zou mogelijk met een lage prioriteit kunnen worden afgehandeld in zijn<br />

eigen thread. Dat houdt de element queues zo klein mogelijk. Misschien kan een element<br />

queue zelfs vermeden worden als er nog geen queue is en en de base komt overeen met de<br />

tip. De betreffende callback procedure kun je dan direct aan roepen in de startfase<br />

procedure.<br />

● Nu iedere element queue een eigen thread heeft moet er<strong>voor</strong> worden gezorgd, dat de<br />

wijzigingen op de changeset geordend verlopen. Dit kan bij<strong>voor</strong>beeld gebeuren met een<br />

queue als de andere, of met een synchronisatie primitieve als een semaphore, critical<br />

section , mutex en dergelijke.<br />

● Een “wait state” kan plaatsvinden in de callback procedure ten behoeve van interactieve of<br />

unattended acties, totdat de envelope is bijgewerkt met het juiste base labored paar (<strong>voor</strong><br />

element queues). Ook in de procedure van de synchronize queue vindt een “wait state“<br />

plaats, totdat de transaction mag eindigen.<br />

● Normaal in database transactions is er binnen een transaction een samenhang die moet<br />

worden bewaakt, waardoor er afhankelijkheden zijn tussen de database opdrachten. Bij<br />

software repositories wordt de samenhang bewaakt buiten de transaction, door builds en<br />

tests, en QA software, vandaar dat we met de geschetste queues kunnen werken, en ieder<br />

element afzonderlijk kunnen toevoegen.<br />

Ik heb bedacht: Starvation kan altijd nog vermeden worden door één persoon aan te wijzen die een<br />

file mag wijzigen: de owner.<br />

Maar toen herinnerde ik mij het eerste project in 2002, waarbij de eerste digitale TV werd<br />

ontwikkeld. Er werden nogal wat programmeurs ingehuurd, die <strong>voor</strong> het eerst te maken kregen met<br />

tv's en hun software. De platform software werd in eerste instantie overgenomen uit analoge tv's en<br />

heel of half gelukte hybride <strong>voor</strong>gangers, en dan aangepast aan de nieuwe tv chip. Dit werd gedaan<br />

door het ingehuurde team. Ieder kreeg een een paar componenten toegewezen, en was daarvan<br />

gedurende de looptijd van het eerste reference project de component owner.<br />

Toen al manifesteerden zich de files die zeer frequent gewijzigd moeten worden. De componenten<br />

waartoe die files behoorden waren de eersten zonder owner: iedereen moest zelf de files aanpassen<br />

als de ontwikkeling van zijn eigen componenten dat eiste. Het werk dat zich <strong>voor</strong>dien ophoopte bij<br />

de owner frustreerde de <strong>voor</strong>tgang, bracht iedereen tot wanhoop, en de owner misschien wel tot<br />

waanzin.<br />

2.8.4 Notifications<br />

Bepaalde gebeurtenissen in het <strong>revision</strong> <strong>control</strong> system kunnen leiden tot notificaties <strong>voor</strong> de<br />

betrokkenen. Dit gebeurt traditioneel door ze een email te sturen. Het plaatsen van een package in<br />

een export-drawer is aanleiding om de integrators van andere teams een email te sturen. De Transfer<br />

van een envelope kan een trigger zijn om de build manager een email te sturen. De implementation<br />

van een envelope waarmee een nieuwe baseline van een package beschikbaar komt is een reden om<br />

mails te sturen naar de satellite owners, enzo<strong>voor</strong>t.<br />

De notificaties waarop iemand zich kan abonneren, zijn mogelijk afhankelijk van security regels.<br />

Pagina: 184 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

Overigens kun je altijd de status van het <strong>revision</strong> <strong>control</strong> system bekijken: door dit geregeld te doen<br />

heb je eigenlijk geen notificatie nodig, en als je een faciliteit hebt die automatisch en regelmatig<br />

polst, dan is er mogelijk een eenvoudige implementatie. Dit is in ieder geval een mogelijkheid <strong>voor</strong><br />

een eerste aanzet van <strong>Climbexion</strong>. Ieder is dan autonoom en bepaalt zelf welke notificaties worden<br />

gepolst. In sommige bestaande systemen worden RSS-feeds gebruikt.<br />

Op een gegeven moment moet er ook maar eens gekeken worden of er mogelijk ook notificaties<br />

zijn waarvan anderen vinden dat iemand ze moet ontvangen, en die dan rücksichtslos instellen.<br />

Behalve het notificeren zouden er al dan niet automatisch scripts gestart kunnen worden om de<br />

notificatie af te handelen. Bij<strong>voor</strong>beeld als er een nieuwe baseline beschikbaar komt van een<br />

geabonneerd package, dan worden automatisch een import area, een satellite en een envelope<br />

<strong>voor</strong>bereid <strong>voor</strong> het inlijven van de baseline in de team-drawer.<br />

2.8.5 Pool operaties<br />

We kunnen het ons gemakkelijk maken en er<strong>voor</strong> kiezen om iedere drawer te <strong>voor</strong>zien van een<br />

location <strong>voor</strong> alle denkbare pools. Voor de gemiddelde gebruiker is dat waarschijnlijk het<br />

gemakkelijkst. Het betekent wel dat de objecten in een pool vaak gekopieerd moeten worden. Zoek<br />

je een optimum, waarbij zo min mogelijk wordt gekopieerd, de security nog acceptabel is, en<br />

waarbij er niet teveel garbage verschijnt in de centrale pools, dan is er mogelijk ook nog wat plezier<br />

<strong>voor</strong> analisten en ontwerpers, om na te gaan hoe je en dergelijk complex opzet.<br />

Ook anderszins kunnen we het ons gemakkelijk maken met de regel: er zijn geen lokale pools. Er is<br />

per package slechts één kin pool en één version pool. Merk op dat hierbij niet geldt dat een drawer<br />

verwijst naar de location van de package pools, maar dat iedere package reference verwijst naar de<br />

pools van het package. Met een dergelijke structuur benaderen we de eenvoud van de vorige<br />

oplossing, maar in ieder geval ten koste van de security van export limitations, en van<br />

beschikbaarheid en mogelijk performance als er netwerk problemen zijn. In deze situatie, zo is de<br />

verwachting, zijn overdrachten zeer efficiënt. Er hoeft immers niet met versions te worden gesleept<br />

(behalve om working-trees en info-trees bij te houden).<br />

Deze twee uitersten zijn mogelijke opties. Maar we zullen toch maar bedenken hoe we moeten<br />

handelen met pools in locations die niet strikt gebonden zijn aan drawers of packages.<br />

Package pools<br />

Creëren, splitsen, samenstellen<br />

Pools zijn opgeslagen in locations. Een drawer verwijst naar de (ene) location waarin de pools van<br />

zijn packages staan. Dit is geen statische en eeuwige situatie. Locations kunnen ontstaan en<br />

beëindigd worden, waardoor de eigenaars de verwijzing van hun drawers moeten aanpassen. Een<br />

package moet geïntroduceerd worden in een location als het package opduikt in één van de drawers<br />

die naar de location verwijzen, en het package mag verwijderd worden, als de gezamenlijke drawers<br />

die overblijven op een location het package niet gebruiken.<br />

Er kunnen redenen zijn om locations te splitsen, als dit vereist wordt door security, groei, splitsen<br />

van teams, thuiswerken, of intensivering van bepaalde activiteiten. Bij<strong>voor</strong>beeld: binnen een<br />

subproject gaan een aantal mensen samenwerken aan een nieuw onderdeel van een package, en<br />

Pagina: 185 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

creëren een sub-team-drawer, en een gemeenschappelijke location <strong>voor</strong> center en satellites. Deze<br />

location splitst zich feitelijk af van de center location van het team.<br />

Er kunnen redenen zijn om locations samen te stellen. Beëindigde projects worden bij<strong>voor</strong>beeld<br />

toegevoegd aan de historische location. Er kan besloten worden om subprojects samen te stellen tot<br />

een one-roof project. Dan kan het efficiënt zijn om pools te combineren.<br />

Creëren splitsen en samenstellen kan op de volgende manier:<br />

● Een pool location moet eerst zijn gecreëerd <strong>voor</strong>dat een drawer ernaar kan verwijzen. Dit<br />

komt vermoedelijk neer op een simpele creatie van een folder en wat lege files in een file<br />

system.<br />

● We gaan ervan uit dat een drawer de location kent van zijn pools, Als van een drawer zijn<br />

verwijzing naar een location wijzigt dan behelst de wijziging een update van de pools van de<br />

nieuwe location.<br />

● We gaan ervan uit dat een location en al zijn drawers bij tijd en wijle gezamenlijk<br />

toegankelijk zijn om “garbage collection” uit te voeren op de pools. Hierbij is het uiteraard<br />

vereist dat de lijst van drawers compleet is.<br />

Bijwerken van pools<br />

Er kunnen alleen elements worden toegevoegd aan package pools. (Met uitzondering van een<br />

garbage collection process waarbij ook elements kunnen worden verwijderd). Kin pools worden<br />

bijgewerkt zodra een nieuwe kin verschijnt in een drawer of envelope, en de version pool wordt<br />

bijgewerkt zodra een nieuwe version verschijnt in een drawer of envelope.<br />

De centrale pool wordt bijgewerkt bij iedere transfer van de ene pool naar de andere. Attribute<br />

wijzigingen kunnen een aanleiding zijn <strong>voor</strong> zo'n transfer. Regelmatig moet ge<strong>control</strong>eerd worden<br />

of de attributes die centraal zijn opgeslagen recenter zijn dan de attributes in de pool, en regelmatig<br />

moet ge<strong>control</strong>eerd worden of de attributes in working-tree of info-tree niet verouderd zijn ten<br />

opzichte van de pool.<br />

Envelope pools<br />

Deze pools horen bij een constellation, bij de center-drawer van de constellation. Als het blijft bij<br />

deze constatering, dan heeft dit de volgende consequentie: Zodra een version, of een nieuwe kin,<br />

wordt vermeld in de envelope, dan moet ook de betreffende package pool bijgewerkt worden. Dit<br />

zou kunnen betekenen dat de version pools van het center “vervuild” worden met allerlei <strong>voor</strong>lopige<br />

dingen die in de satellite ontstaan.<br />

Voorlopig houd ik het er maar op dat een personal computer, waarop satellites van een constellation<br />

<strong>voor</strong>komen, een envelope pool heeft. De envelopes in deze pool en hun inhoud, zijn nog niet<br />

“gepubliceerd”. Dat gebeurt pas als ze verhuizen naar de constellation pool. In de status “preparing΅<br />

kan een envelope dus <strong>voor</strong>komen in de pc pool, in de constellation pool, of in beiden.<br />

Pool opdrachten <strong>voor</strong> envelopes:<br />

● create: nieuw in een satellite pool<br />

● publish: transfer naar de constellation pool. Dit kan op onderdelen, zodat bij<strong>voor</strong>beeld eerst<br />

base versions gepubliceerd zijn, en labored versions pas als de transfer van software<br />

plaatsvindt van satellite naar transfer-drawer, of naar center-drawer.<br />

Pagina: 186 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

● rework: copy naar de satellite pool<br />

In eenvoudige situaties is er slechts de constellation pool, maar geen PC gerelateerde pool en is er<br />

slechts de pool opdracht “create”.<br />

Pools <strong>voor</strong> other-focused files<br />

Deze pools horen bij een project, maar ook bij een package. Locations waarin deze pools kunnen<br />

<strong>voor</strong>komen behoren tot een subproject. Het uitwisselen van other-focused files, vindt plaats binnen<br />

het master-project, maar wordt niet verwacht als sister-projects onderling gegevens uitwisselen.<br />

Pools op een PC zijn dan ook meestal <strong>voor</strong> één project, waar version pools bij<strong>voor</strong>beeld gebruikt<br />

kunnen worden <strong>voor</strong> meerdere projects.<br />

Misschien is het om te beginnen raadzaam om je te beperken tot snapshot-focused files en alleen<br />

“own-drawer-focused” filestrings te implementeren.<br />

Files die we niet willen overdragen vanuit een satellite zouden moeten refereren aan een tag die<br />

gebonden is aan die satellite, en die niet wordt overgedragen. Voorbeeld: een opgeslagen build<br />

result kan zijn vervaardigd <strong>voor</strong> een tag in de center-drawer. En daarna gedistribueerd naar<br />

satellites. Iemand maak <strong>voor</strong> zichzelf een build result op hetzelfde snapshot, waarin bij<strong>voor</strong>beeld<br />

enige logging wordt geactiveerd. Deze version mag niet gedistribueerd worden, dus zou de version<br />

niet mogen worden gemaakt op dezelfde tag, er is dus een nieuwe file nodig, refererend naar een<br />

nieuwe tag.<br />

Een probleem kan ontstaan als een overdracht heeft plaatsgevonden van de éne drawer naar de<br />

andere, bij drawers zonder gemeenschappelijke pool. Als daarna een version wordt vervaardigd<br />

<strong>voor</strong> een file in de file-string, of als een file ontstaat in de file-string, en de tag is reeds<br />

overgedragen dan komt de version of de file niet automatisch beschikbaar in de drawer die verwijst<br />

naar een andere pool location.<br />

Versions die wel automatisch zijn doorgevoerd moeten daarna nog hun weg vinden naar (virtual)<br />

info-tree of working-tree.<br />

Wijzigingen op other-focused file-strings worden doorgevoerd in een centrale pool, <strong>control</strong>e op<br />

wijzigingen kan dan gelaagd plaatsvinden, eerst wordt bepaald of de centrale pool gewijzigd is<br />

sinds de vorige keer, zo ja dan wordt bepaald of een geabonneerde file-string gewijzigd is, tenslotte<br />

of er nieuwe files of versions zijn. Dit kan periodiek unattended plaatsvinden, maar ook op het<br />

moment dat een (virtuele) info-tree of working-tree wordt gemaakt. De centrale pool bij wijzigingen<br />

in een center-drawer die doorgevoerd moeten worden in satellites is gerelateerd aan die centerdrawer.<br />

Bij wijzigingen die geëxporteerd worden is de centrale pool gerelateerd aan de exportdrawer.<br />

Pool operaties:<br />

● create: in een location, met eventuele verwijzing naar de centrale location.<br />

● Synchronize: indien een drawer ernaar gaat verwijzen door een location change wordt<br />

bepaald welke file-strings, files en versions erin opgenomen moeten worden en uit de<br />

oorspronkelijke pool moeten worden gekopieerd.<br />

● Synchronize: om de pool periodiek, of incidenteel, bij te werken vanuit de centrale location.<br />

Tot nu toe spreken we over pool, alsof de verzameling filestrings vrij ongestructureerd is. Maar het<br />

Pagina: 187 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

ziet ernaar uit dat de pool stevig gestructureerd kan zijn, en een tree structuur zoals een drawer kan<br />

hebben, zodat derived files in andere folders komen dan test-reports, die weer ergens anders staan<br />

als baseline-documents. Dat zou betekenen ze in wezen een drawer structuur kunnen hebben, of dat<br />

de drawers zelf de filestrings bevatten. Dan is het ook nog maar de vraag of de filestring reference<br />

blijft bestaan, zodat er onderscheid is tussen het raadplegen of gebruiken van de data via de<br />

reference en het onderhouden ervan, rechtstreeks in de filestrings. Ik moet daar nog maar eens goed<br />

over nadenken.<br />

2.8.6 Importeren, Exporteren<br />

Eén <strong>revision</strong> <strong>control</strong> system <strong>voor</strong> allen is onhaalbaar, zelf een team moet soms opereren met<br />

meerdere systemen: één per klant. Zelfs is het zo dat verschillende teams verschillende merken<br />

<strong>revision</strong> <strong>control</strong> systems gebruiken. Wat ik hier heb gespecificeerd is nu niet bepaald compatibel<br />

met andere systemen.<br />

1. Binnen <strong>Climbexion</strong>.<br />

Snapshots van drawers en packages kunnen worden geëxporteerd en geïmporteerd met references<br />

naar kins, en versions, en met overige attributes. References naar envelopes worden niet<br />

geëxporteerd. Gegeven de pools behoeven versions en kins niet “in stream” geïmporteerd of<br />

geëxporteerd te worden: ze worden gekopieerd als ze nodig zijn in een work of info-tree, of in een<br />

lokale subpool. Een snapshot van een drawer of een package zoals dat in de drawer is opgeslagen<br />

wordt als een stream verzonden en ontvangen.<br />

Uiteraard kunnen er import en export limitations gelden, of speciale regels. Die moeten natuurlijk in<br />

acht worden genomen.<br />

Voor adopt merge geldt bij<strong>voor</strong>beeld de volgende query: We selecteren package S, export<br />

limitations gelden niet, we willen geen mutaties van name course en folder reference course tenzij<br />

het element nieuw binnenkomt, we hoeven geen other-focused files, geen classification-sets en<br />

classification-anchors, geen inner-reach van test folders. We willen een filetype <strong>control</strong>e op<br />

compatibiliteit, niet slechts als waarschuwing, nee, incompatible files moeten echt niet<br />

geïmporteerd worden. Ook willen we geen event items die aangeven dat een element niet meer<br />

bestaat.<br />

Exact copy.<br />

Gegeven bij<strong>voor</strong>beeld: laatste overgenomen snapshot tag_a. Het over te nemen snapshot is<br />

tag_b. De source drawer is in beide gevallen drawer S, de destination drawer is in beide<br />

gevallen drawer D. We gaan er even van uit dat export limitations niet gerealiseerd zijn<br />

middels een aparte drawer. De import/export limitations nu op het moment van query ild,<br />

els.<br />

De gang van zaken kan als volgt zijn: destination drawer D vraagt drawer S om de<br />

betreffende set event items:<br />

Query snapshot=tag-b, importLimitations=ild<br />

De source drawer S bepaalt:<br />

export = ild (els (snapshot(drawer(S), tag_b)))<br />

en stuurt export over naar D in de vorm van een set nieuwe event items. De destination<br />

drawer plaatst een subset van export als succession in zijn tip. De verzameling event<br />

items:<br />

Pagina: 188 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

exclude = intersection (export ,snapshot(drawer(D), tip))<br />

wordt niet aan de tip toegevoegd, maar slechts de set<br />

changeset = export\exclude.<br />

De destination drawer D <strong>control</strong>eert of er nieuwe kins en nieuwe versions in zijn (lokale)<br />

pools moeten worden geplaatst en nieuwe elements in zijn drawer. De grootste compactheid<br />

wordt waarschijnlijk bereikt als er een diff programma bestaat <strong>voor</strong> een filetype. Dan<br />

behoeven <strong>voor</strong> de betreffende tag-b versions slechts de delta's te worden verstuurd ten<br />

opzichte van tag-a versions. De query wordt nu:<br />

Query snapshot=tag-b, importLimitations=ild,lastSnapshot=tag-a<br />

De drawer D software zoekt <strong>voor</strong> iedere nieuwe version de id van de tag-a version, en<br />

maakt de delta's. Er is misschien een samenloop van omstandigheden waardoor deze version<br />

in de pool van D niet <strong>voor</strong>komt dan wordt de volledige version gekopieerd. Delta's of<br />

volledige versions bevatten uiteraard alle metadata om de nieuwe version lokaal in de pool<br />

te zetten, inclusief zijn originele valid time timestamp. Een error log vermeldt de filetype<br />

conflicten en incompatibiliteiten. Een optie bepaalt of een error een uitschieter is, of moet<br />

worden geaccepteerd. De subset courses in D die hierdoor gewijzigd wordt wordt volledig<br />

bepaald door de events die in de set export worden overgestuurd.<br />

Een volledige vervanging eist dat alle courses worden beëindigd, waarvan de tip behoort tot<br />

de set elements:<br />

elements(snapshot(drawer(D),tip))\elements(export).<br />

Als een package U moet worden vervangen dan geldt dat alle courses moeten worden<br />

beëindigd waarvan de tip behoort tot de set: elements<br />

elements(snapshot(package(D,U),tip))\elements(export)<br />

Uiteraard moet export dan als volgt tot stand zijn gekomen:<br />

export = ild(els(snapshot(package(S,U),tag_b))).<br />

In principe kun je werken op een gehele drawer of op een package met 3 soorten<br />

limitations:<br />

● import limitations van Destiny: ild. Dit kan een combinatie zijn van vaste drawer en<br />

package gerelateerde limitations en van adhoc limitations.<br />

● export limitations van Source: els.<br />

● replacement limitations van Destiny: rld. Dit is de verzameling courses die vervangen<br />

moeten worden door export, of anders beëindigd. We nemen aan dat geldt:<br />

elements (ild (snapshot(f(D),tip))) ⊆ elements (rld<br />

(snapshot(f(D),tip)))<br />

We gaan er bij deze methode vanuit dat sinds de vorige keer er wijzigingen kunnen zijn<br />

geweest in els en ild. Als limitations geen rol spelen, of als ze niet gewijzigd zijn, kunnen<br />

we uitgaan van de course van de changesets in de source drawer, de wijzigingen die "live"<br />

zijn in de reeks changesets van tag-a naar tag-b kunnen worden vastgesteld en vormen<br />

de export, eventueel na toepassing van els en ild.<br />

Adopt merge.<br />

De source drawer is een merge-import-drawer, destination is een satellite van de teamdrawer.<br />

original is het snapshot waarmee de vorige keer een exact copy is uitgevoerd<br />

vanuit een sister-project in de merge-import-drawer. neighbor is de tip van deze drawer,<br />

die ontstaan is uit een recente exact copy, mogelijk gevolgd door een aantal “undo”<br />

changesets. Als je gaat kijken in de merge-import-drawer dan zie je daar de volgende<br />

Pagina: 189 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

sequentie van tags: …, Rn (baseline tag), Un(undo tag), Rn+1(baseline tag) , Un+1(undo tag).<br />

Rn specificeert het original, en Un+1 specificeert de neighbor.<br />

Destination drawer is een team-drawer satellite, waarin met exact copy de tip of tip-tag van<br />

een team-drawer is geplaatst: dit is een snapshot dat de base omvat. Mogelijk geldt er een<br />

import limitation: il, die geldt <strong>voor</strong> het original, en de neighbor en de base.<br />

Er is natuurlijk een kans dat il gewijzigd is sinds Rn werd geïmporteerd, dan geldt dat Rn<br />

opnieuw moet worden geïmporteerd, en krijg je bij<strong>voor</strong>beeld de volgende sequentie van tags<br />

…, Rn (baseline tag snapshot geïmporteerd met il_oud), Un(undo tag), Rn(baseline tag,<br />

snapshot geïmporteerd met il), Rn+1(baseline tag geselecteerd met il), Un+1(undo tag).<br />

Nu moet de meest recente tag Rn gekozen worden om original te specificeren. We<br />

nemen aan dat tussen dit en het sister-project geen export limitations gelden, anders zou je<br />

ook nog moeten checken of die een wijziging op Rn teweeg zouden brengen. We zijn<br />

natuurlijk slim en gebruiken <strong>voor</strong> het importeren uit het sister-project de merge-import<br />

limitation mil. Als relatie (ilt,Ri) (i= 1..n) de verzameling original snapshots<br />

<strong>voor</strong>stelt die in een project geselecteerd worden <strong>voor</strong> adopt merge vanuit de merge-importdrawer,<br />

en er geldt:<br />

∀(ilt,Ri), ilt(Ri) ⊆ mil(Ri) waarbij i = (1..n)<br />

dan hoeven we geen 2 imports te plegen van dezelfde baseline. Voor merge hebben we dan<br />

enige vrijheid om ilt een beetje te variëren zonder een baseline opnieuw te importeren.<br />

Heerlijk dit orakelen met wiskunstige symbolen.<br />

Hoe merge verloopt is te vinden in 2.4.8<br />

Exact copy bij de start van het oplossen van een work-item.<br />

Als je ervan uitgaat, dat je een satellite kunt gebruiken <strong>voor</strong> het achtereenvolgens oplossen<br />

van een reeks work-items, dan kun je exact copy optimaliseren.<br />

Het betreft hier het synchroniseren van de satellite met de tip-tag van de team-drawer. In<br />

principe hebben we bij exact copy te maken met ild, els en rld. We gebruiken mogelijk<br />

geen els binnen een team. Voor rld kiezen we: alle courses in de satellite: elke course<br />

wordt ofwel beëindigd, ofwel de tip wordt uitgebreid, ofwel de tip wordt bevestigd door de<br />

geïmporteerde changeset. Uiteraard wordt ook de working-tree up-to-date gebracht.<br />

Merge copy bij het opnieuw synchroniseren.<br />

Voor de merge list is de vorige exact copy de verzameling originals. Het begint met commit<br />

van de gewijzigde files. De nu ontstane tips worden de neighbors in de merge list, tenminste<br />

als de version afwijkt van de base version. Dan exact copy met de tip-tag van de teamdrawer,<br />

dit wordt de verzameling bases in de merge list. Bij het uitvoeren van de merge<br />

worden de resultaten geplaatst in de working-tree. ild en rld blijven normaal hetzelfde<br />

gedurende het werk aan een work-item. In de merge list komen alleen die elements waarvan<br />

een neighbor is bepaald. De laatste merge copy plaatst alleen elements uit de envelopes in de<br />

merge list, en pleegt exact copy met de tip van de transfer-drawer.<br />

2. Exporteren naar andersoortige repositories.<br />

Archief-files (bij<strong>voor</strong>beeld zipfiles, of tarballs) van working-trees of info-trees worden<br />

geëxporteerd, of mogelijk slechts packages hieruit. Mogelijk wordt elk element <strong>voor</strong>zien van een<br />

property sheet file met attributes (metadata). Bij<strong>voor</strong>beeld: element helloworld.c wordt begeleid<br />

door helloworld.c.prop. Ik moet eens nagaan of hier<strong>voor</strong> standaards zijn bedacht. Deze property<br />

sheets komen wat mij betreft in een schaduw folder structure, zodat ze op <strong>voor</strong>hand gescheiden zijn<br />

Pagina: 190 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

van de files, en folders. zijn, Middels een tool kunnen ze verenigd worden in de course van een<br />

element, of in de version. Een <strong>Climbexion</strong> tool moet deze property sheets genereren.<br />

3. Importeren van andersoortige repositories.<br />

Ook hier gebruiken we archief-files. De allereerste keer beginnen we met een lege satellite en<br />

working-tree, of een lege package hierin. Daarna prepareren we de satellite en zijn working-tree met<br />

de vorige versie. We vervangen de working-tree of het package in de working-tree door de archieffile.<br />

Een exact copy van working-tree naar de tip (en envelope) importeert de archief-file in de<br />

satellite. Meta data, – indien aanwezig –, worden ingevoerd met hulp van een <strong>Climbexion</strong> tool dat<br />

er de satellite mee wijzigt, en de envelope bijwerkt, en dat de version pool en kin pool bijwerkt. Als<br />

files verplaatst zijn, of een andere naam hebben gekregen dan betekent dit een breuk in de course<br />

van die files, tenzij de metadata <strong>voor</strong>ziet in het behouden van de course, bij<strong>voor</strong>beeld door kins op<br />

te nemen als attribute.<br />

<strong>Climbexion</strong> baselines<br />

De software <strong>voor</strong> de diverse implementaties van <strong>Climbexion</strong> moeten compatible zijn. Een<br />

<strong>Climbexion</strong> subsystem <strong>voor</strong> pool onderhoud moet compatibel zijn met het subsystem <strong>voor</strong> drawers.<br />

<strong>Climbexion</strong> op servers moet compatibel zijn met <strong>Climbexion</strong> op Pc's. <strong>Climbexion</strong> systems binnen<br />

een master project moeten onderling compatibel zijn enzo<strong>voor</strong>t.<br />

2.8.7 Virtualisatie<br />

Dit is niet iets dat vanaf het begin in <strong>Climbexion</strong> geïmplementeerd wordt. De "body" van<br />

<strong>Climbexion</strong> wordt gevormd door de opgeslagen versions. Al het andere: folders, courses, names, is<br />

"registratie en structurering"van een subset uit die body. Nu zijn er wel veel registraties van<br />

versions in drawers en hun satellites, in verschillende subprojects, en ze zijn overal "ongeveer"<br />

hetzelfde. Kan die registratie niet compacter, met minder redundancy. Bij<strong>voor</strong>beeld de importdrawer,<br />

moet die alle baselines bevatten van alle packages in een project, of hoeft die slechts<br />

verwijzingen te bevatten, naar de baselines in de export-drawers van andere teams? Voor de<br />

gebruikers kan het "paradigma"van de import-drawer intact blijven, De referentie is een<br />

"verborgen" registratie, die samen met een retrieval procedure de suggestie wekt van een<br />

"bevattende" opslag-methode. De methode kan gebruikt worden in import -, export -, team -<br />

drawers, satellites enzo<strong>voor</strong>t.<br />

Bij de start van een drawer, dat wil zeggen: “ik denk bij de start van de meeste drawers”, wordt een<br />

snapshot gekopieerd uit een andere drawer. Dit geldt in ieder geval <strong>voor</strong> het merendeel van<br />

satellites. In plaats van kopiëren zou een reference opgenomen kunnen worden naar het snapshot in<br />

de andere drawer. Iets soortgelijks zou kunnen gebeuren in een satellite bij tussentijds opnieuw een<br />

base bepalen, of bij import-drawers bij het binnenhalen van een baseline. Hiermee zou je de DAG<br />

terugkrijgen. Als dit ooit geïmplementeerd wordt denk ik dat je weloverwogen moet besluiten om te<br />

kopiëren of te refereren. Net als bij clones geldt: wil je afhankelijk zijn van de beschikbaarheid van<br />

de andere drawer of van de performance van de verbinding of niet. Binnen de afdeling van NXP<br />

was er een uitstekend intranet met goede beschikbaarheid en goede performance. Maar de<br />

verbindingen met andere teams waren significant trager. Door de tijdsverschillen kon je soms<br />

niemand bereiken als remote repositories niet bereikbaar waren. Thuis en onderweg werken gold op<br />

ieder moment slechts <strong>voor</strong> enkelen, vanwege de afhankelijkheid van hardware, maar maar het gold<br />

Pagina: 191 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

altijd wel <strong>voor</strong> sommigen. En ook hier geldt als je kiest <strong>voor</strong> reference, dan wordt je afhankelijk van<br />

het internet.<br />

Mijn oorspronkelijke idee was dat iemand één of misschien twee satellites nodig zou hebben, later<br />

vond ik dat je een satellite moest hebben <strong>voor</strong> ieder probleem dat je oplost. Zo'n satellite kan<br />

beginnen met een reference naar een snapshot van een andere satellite, gevolgd door een exact copy<br />

vanuit een team-drawer, waarbij slechts verschillen hoeven te worden gekopieerd. Maar als je oude<br />

satellites verwijderd, dan moeten gerefereerde snapshots alsnog gekopieerd worden in de nieuwere<br />

satellites. Voor ongewijzigde elements moet het algoritme mogelijk een keten van references<br />

volgen.<br />

Local pools eisen dat je van alles dat je wilt zien een lokale kopie hebt. Je kunt iets maken met pool<br />

reeksen: eerst wordt lokaal gekeken of daar de kopie <strong>voor</strong>komt, dan meer centraal, en misschien<br />

zelfs super centraal. Een nieuw exemplaar wordt om te beginnen zo lokaal mogelijk opgeslagen,<br />

maar verhuist, naarmate de kring van gebruikers toeneemt. Daardoor zou minder opslag van<br />

kopieën nodig zijn, en zouden sommige acties korter duren, maar andere weer langer. Verder geldt<br />

ook hier, wil je afhankelijk zijn van beschikbaarheid en performance van verbindingen, of toch een<br />

lokale cache gebruiken. Er is wel een trend om je altijd en overal afhankelijk te maken van digitale<br />

verbindingen.<br />

Info-trees, hoeven geen fysieke folders te zijn op disks in lokale pc's, of in file servers. Er kan een<br />

virtual file system gemaakt worden dat info-trees zichtbaar maakt als een folder, terwijl er slechts<br />

een script met query's (een <strong>voor</strong>schrift <strong>voor</strong> het samenstellen van de info-tree) echt bestaat. Zo'n<br />

info-tree kan niet gewijzigd worden: als je wilt wijzigen dan moet de info-tree gekopieerd worden<br />

in het lokale file system. Een dergelijk overzicht moet geleverd kunnen worden door <strong>Climbexion</strong>, al<br />

hoeft de virtuele info-tree niet per se zichtbaar te worden gemaakt met hulp van een virtual file<br />

system.<br />

<strong>Climbexion</strong> moet eerst maar eens werken <strong>voor</strong>dat virtualisaties worden geïmplementeerd. Naast<br />

virtualisatie kunnen de paradigma mogelijk zelf herzien worden om te komen tot een systeem dat<br />

leaner en meaner is dan het prototype. Bij<strong>voor</strong>beeld: importeren in een import-drawer is overbodig,<br />

exporteren vanuit een export-drawer is overbodig. Voor al deze optimalisaties geldt: “Don't do it<br />

now”.<br />

2.8.8 Begrenzen?<br />

Package Feature (Requirement) List<br />

Een subproject maakt zo'n feature lijst <strong>voor</strong> ieder package dat in het subproject wordt bijgehouden.<br />

Dit is een goed uitgangspunt <strong>voor</strong> het verdere plan van aanpak, en het structureren van tests.<br />

Waarschijnlijk is ook dit een deel van SCM, immers dank zij zo'n list onderscheidt het package<br />

zich, ten opzichte van hetzelfde package in een ander subproject, dat een andere feature list heeft.<br />

Een belangrijke maar <strong>voor</strong>lopig vage eis is, dat de feature lists onderling vergelijkbaar zijn. Samen<br />

met een subproject tree, waarin te zien is hoe feature lists van elkaar zijn afgeleid, is dit best<br />

interessante informatie. De feature list, zelf kan als file worden opgeslagen binnen <strong>Climbexion</strong>,<br />

maar zijn editor, en de software <strong>voor</strong> de overzichten maken er geen deel van uit. Tijdens<br />

development is een dergelijk overzicht nuttige informatie <strong>voor</strong> stakeholders. De informatie is<br />

waarschijnlijk bruikbaar <strong>voor</strong> integrators bij de start van een nieuw (design-in) subproject, om te<br />

bepalen welk subproject het initiële package levert <strong>voor</strong> het nieuwe project. NXP heeft gedurende<br />

Pagina: 192 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

een bepaalde tijd zo'n systeem bijgehouden, in één van zijn teams. Toen de projects van dat team<br />

teneinde waren en het team is opgeheven, is het systeem waarschijnlijk niet overgenomen door<br />

andere teams.<br />

In de oorspronkelijke opzet werd één enkel MS Access bestand gebruikt over alle subprojects. Door<br />

deze opzet werd de informatie van een subproject niet bij het subproject in het <strong>revision</strong> <strong>control</strong><br />

system geplaatst. In feite was er een een Access file per publieke component, dus niet per package.<br />

In de team organisatie was er een architect die verantwoordelijk was <strong>voor</strong> het hele package, en<br />

software engineers (de component owners) die verantwoordelijk waren <strong>voor</strong> de publieke<br />

componenten in een package. Feature lists werden bijgehouden per publieke component. Deze<br />

opdeling ontlaste de architect die als spil in het geheel fungeerde.<br />

Een <strong>Climbexion</strong> element is vaak een file. De basis entiteit van het feature list gebeuren is een lijst<br />

per subproject per component. Het ligt <strong>voor</strong> de hand om zo'n basis entiteit in een file te stoppen, en<br />

zo gebruik te maken van <strong>Climbexion</strong> <strong>voor</strong> opslag, distributie en identificatie. Voor de Feature List<br />

software betekent dit dat de subproject tree wordt samengesteld uit de files in de verschillende<br />

subprojects.<br />

Project documentatie<br />

Philips standaards zijn <strong>voor</strong>tgekomen uit een IEEE standaard <strong>voor</strong> project documentatie. Reden om<br />

de documenten op te nemen in het <strong>revision</strong> <strong>control</strong> system:<br />

● uniformiteit en beschikbaarheid: er is één plaats waar deze informatie wordt bijgehouden en<br />

beschikbaar is.<br />

● Het <strong>revision</strong> <strong>control</strong> system wordt zo een zo volledig mogelijke gegevensbank waarin<br />

analyses kunnen plaatsvinden ten behoeve van project-evaluaties, en ter lering en vermaak.<br />

Normaliter is een project zo gestructureerd dat er een overall project is, dat bestuurd wordt namens<br />

de client van het project, en subprojects, één per team, of mogelijk, één <strong>voor</strong> een party.<br />

Ik zal nu niet bestuderen hoe de eventuele functionaliteit van <strong>Climbexion</strong> kan worden uitgebreid ten<br />

behoeve van het beheer van project documentatie. <strong>Climbexion</strong> is bedacht <strong>voor</strong> het opslaan van<br />

software, maar je kunt er misschien “ook” project documentatie in opslaan. Het “ook” gehalte is<br />

mogelijk niet al te best.<br />

Tools<br />

Als de tool beheerders behoren tot een team in het project, dan is er sprake van een gewoon<br />

package, ik heb het hier over tools waarvan het beheer op afstand staat van het project, met een<br />

onafhankelijke ontwikkeling.<br />

Opslag van tools is nuttig. Soms moet je terug in de ontwikkeling om bepaalde problemen te<br />

reproduceren, een andere keer wordt een package van een oud project het origineel in een nieuw<br />

project. In die gevallen moet je mogelijk terugvallen op het oude tool. Ook kun je in een team<br />

werken aan verschillende projects, die ieder een andere generatie van een tool gebruiken, of een<br />

tool van verschillende leveranciers.<br />

Toch zijn er grenzen. Een oud operating system, of een oude internet browser kun je terughalen uit<br />

een beëindigd project. Maar het lijkt onverstandig om het uit te voeren vanwege de veiligheidsrisico's.<br />

Ook als je werkelijk oud materiaal terugzet, dan kan het zijn dat het niet meer werkt of<br />

Pagina: 193 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

bouwt in enige beschikbare hardware/software omgeving.<br />

Een andere grens is er omdat er tools zijn die die niet in beheer zijn bij een project maar bij de<br />

“staande” organisatie. Bij<strong>voor</strong>beeld office en communicatie pakketten. Zelfs onderdelen van<br />

ontwikkelomgevingen zijn vaak niet project gebonden. Tools die bijgehouden worden buiten de<br />

drawer zijn potentieel een bron van problemen als een oud project wordt teruggezet. Bij<strong>voor</strong>beeld<br />

<strong>voor</strong> het repareren van een probleem bij een eindgebruiker van de TV is de toenmalige compiler<br />

met linker, en bibliotheek met standaard software nodig.<br />

Tool problemen bij het terugzetten van snapshots uit oude projects kunnen worden veroorzaakt door<br />

ongedocumenteerde variables en values in registries, environment tables of configuration files die<br />

nodig zijn <strong>voor</strong> een de build van een executable <strong>voor</strong> een specifiek hardware platform. Het is aan te<br />

bevelen om in zo'n geval de variable in te bedden in een specifiek script waarmee de build <strong>voor</strong> het<br />

platform wordt uitgevoerd. Het script is dan in ieder geval te vinden in een tools folder. En het<br />

script werkt environment variables en registries bij.<br />

Tools kunnen worden opgeslagen in een tarball of zipfile, als hun installatie weinig méér inhoud<br />

dan de folder met inhoud op een PC plaatsen. Tools kunnen opgeslagen worden als een installatie<br />

pakket als de installatie meer inhoudt en er ook registries of environment variables moeten worden<br />

bijgewerkt, of als delen van de software moeten worden geïnstalleerd in systeem folders. Ook een<br />

combinatie is mogelijk: een folder structuur in een archief file, en een script file om de omgeving<br />

aan te passen.<br />

Als tools worden opgeslagen als installatie pakket, dan moeten eventuele patches mogelijk<br />

afzonderlijk worden opgeslagen, zodat je eerst installeert en dan patches aanbrengt. Dit zal niet<br />

altijd gemakkelijk zijn, bij<strong>voor</strong>beeld als de patches worden aangebracht door internet update<br />

procedures, waarna ze niet meer zijn te lokaliseren. Als een tool wordt opgeslagen in het <strong>revision</strong><br />

<strong>control</strong> system, dan moeten er wat dit betreft goede afspraken worden gemaakt met de leverancier.<br />

Soms werk je <strong>voor</strong> diverse projects. Als je werkt aan het ene project en je switcht naar het andere,<br />

dan wil je eigenlijk dat je slechts een andere folder in je filebrowser moet moet selecteren, of een<br />

andere drawer in je <strong>revision</strong> <strong>control</strong> tool en dan ben je over. Maar soms kunnen tools en hun<br />

omgevingseisen maken dat je een scripts moet uitvoeren als je switcht. Bij<strong>voor</strong>beeld omdat het niet<br />

mogelijk is om tegelijkertijd twee releases van één tool op één PC te gebruiken.<br />

In <strong>Climbexion</strong> komen in het begin geen extra <strong>voor</strong>zieningen <strong>voor</strong> tools.<br />

Build tools en uitbreidingen van IDE's.<br />

Voorlopig worden build tools niet geïntegreerd met <strong>Climbexion</strong>. Er zijn diverse build tools en IDE's<br />

die geïntegreerd zijn met een <strong>revision</strong> <strong>control</strong> system, met faciliteiten om een working-tree te<br />

synchroniseren, en wijzigingen met commit in te lijven. In het begin kunnen we bestaande tools<br />

gebruiken, en separate <strong>Climbexion</strong> software <strong>voor</strong> de diverse soorten synchronisatie, commit,<br />

envelope onderhoud en transfer.<br />

Testplek, kabinet, board, equipment administratie<br />

De redenen om deze administratie bij het <strong>revision</strong> <strong>control</strong> system op te nemen zijn dezelfde als die<br />

van project documentatie.<br />

Pagina: 194 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

De beschikbaarheid van de registratie betekent primair dat iemand kan vaststellen wat de meest<br />

geschikte testplek is <strong>voor</strong> de sessie die hij wil starten.<br />

Verder geldt ook nog dat, mocht het nodig zijn om een bepaalde configuratie opnieuw op te zetten,<br />

dat je dan kan zien in de administratie hoe dat moet, omdat een expert het ooit heeft <strong>voor</strong>gedaan.<br />

Een configuratie op een bepaalde tijd van een testplek beschrijft in feite wat er nodig was <strong>voor</strong><br />

bepaalde test - of analyse - of debug - sessie. Uiteindelijk is dit een schat aan informatie, zeker als<br />

dit verband óók wordt vastgelegd. Bij<strong>voor</strong>beeld door een verwijzing naar de configuratie gegevens<br />

toe te voegen aan de log van een work-item.<br />

Om zo'n administratie goed up-to-date te laten houden zou je equipment (meestal signaal<br />

generatoren) mogelijk moeten uitrusten met RFID chips, zodat ieder op elk moment kan vaststellen<br />

waar het zich bevindt, en er niet naar hoeft te lopen zoeken. Daarnaast zou van equipment moeten<br />

worden geregistreerd in welke opstelling ze gebruikt wordt, misschien door automatisch vast te<br />

stellen in welk cluster stopcontacten het is ingeplugd. Deze en andere maatregelen zouden<br />

uiteindelijk moeten leiden tot een situatie waarin iemand zijn plaats niet hoeft te verlaten, om een<br />

testplek te kiezen, en de inrichting ervan te plannen.<br />

De software die in de testplek geladen is op een zeker moment behoort zeker tot de informatie die<br />

zou moeten worden geregistreerd.<br />

Tenslotte is er de registratie van audio en video streams, dvd's cd's en video tapes, patterns <strong>voor</strong><br />

pattern generators die gebruikt worden in specifieke tests. Van dvd's cd en video tapes wil je graag<br />

weten waar ze uithangen, van patterns wil je weten door welke generators ze kunnen worden<br />

gegenereerd, van streams in welke folder ze staan, en van al deze dingen waar<strong>voor</strong> ze geschikt zijn.<br />

Ook is het interessant om te weten wanneer in welke opstelling en waar<strong>voor</strong> ze gebruikt zijn.<br />

Als je kans ziet om deze registratie goed <strong>voor</strong> elkaar te krijgen, betrouwbaar, actueel en zonder<br />

teveel overhead, dan rest nog het probleem van de kabels, snoertjes, plug adapters enzo<strong>voor</strong>t. Bij<br />

het geschikt maken van een opstelling zou je hier niet naar moeten zoeken, of ze roven van een<br />

andere opstelling.<br />

Het hangt een beetje af van de laatste reorganisatie. Soms valt het middelen beheer onder de<br />

“staande”organisatie, dan weer wordt het beheer aangestuurd door een projectmanager <strong>voor</strong> de<br />

subprojects die onder zijn verantwoordelijkheid vallen. Project management zoals ik dat vroeger<br />

ooit geleerd heb (een cursus van Twynstra Gudde eind jaren 80), heeft te maken met fasering en met<br />

beheersing, en met <strong>voor</strong>tgangsbeslissingen. Beheersaspecten, leerde ik, zijn: tijd, geld, kwaliteit,<br />

organisatie en informatie. Tegenwoordig zie je dat bij<strong>voor</strong>beeld risico beheersing een apart continu<br />

beheersaspect is (PMBoK in Wikipedia). In de TV software projects zou het middelen beheer ook<br />

wel in aanmerking kunnen komen om tot apart aspect te worden verheven. En in het overall project<br />

is het maken van prototypes en tv's <strong>voor</strong> testen, proef productie opstellingen reeds een bron van<br />

activiteiten.<br />

Dit is een separaat systeem. In <strong>Climbexion</strong> komen geen <strong>voor</strong>zieningen om aan te sluiten op dit<br />

systeem, trouwens verwijzingen naar specifieke hardware en testplek configuraties zouden eerder<br />

thuishoren in work-items, dan in envelopes.<br />

Installatie software<br />

In het verlengde van het build proces is er de installatie van software op een target system.<br />

Pagina: 195 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

Er zijn source systems waaruit files geselecteerd worden, een medium waarmee de geselecteerde<br />

files als package verzonden worden naar een target system. Working-trees of info-trees maken deel<br />

uit van de source systems. Op het target system moet worden ge<strong>control</strong>eerd of de te installeren<br />

software er kan draaien, en zo ja dan moeten de files geheel of gedeeltelijk op het target systeem<br />

worden geplaatst. Soms moet de juiste variant van een onderdeel van het package worden<br />

geselecteerd. Misschien is de opslagstructuur afhankelijk van het target. Mogelijke referenties naar<br />

files of file inhoud moeten worden bijgehouden, en misschien moeten configuratie files en<br />

parameters worden aangepast.<br />

Bij CE werd reeds rekening gehouden met de trend om eindgebruikers of dealers gewijzigde<br />

software te sturen. De installatie software gebruikte dan ook security methoden zoals encryptie, en<br />

elektronische handtekening.<br />

Installatie software kan een package zijn binnen climbexion, Verder is er geen relatie met<br />

climbexion.<br />

Expertise database<br />

Het vinden van de juiste persoon <strong>voor</strong> een functie in een project, <strong>voor</strong> het toekennen van een<br />

werkopdracht, of <strong>voor</strong> hulp bij het uitvoeren van een werkopdracht, het vinden van zo'n persoon is<br />

niet altijd eenvoudig. Een database met de bekwaamheden van een persoon is dan ook gewenst. De<br />

database kan deels handmatig worden bijgehouden, deels automatisch door iemands bijdragen aan<br />

projects, packages, en work-items te monitoren. Ook de beschikbaarheid van iemand, zou<br />

vastgelegd moeten worden. Bij<strong>voor</strong>beeld: consultancy beperkt zich tot een team, een (master)<br />

project, een party, of is (tijdelijk) niet mogelijk.<br />

Recepten boek<br />

Hoe maak je een test script, hoe ziet een Koala pd file eruit, hoe zet je een debug sessie op tussen<br />

een PC en een TV, wat is Horcom, alles over aspect ratio: kijk in het recepten boek, gemaakt door<br />

iedereen <strong>voor</strong> iedereen. De lokale Wikipedia.<br />

Allereerst is een redactie nodig. Verder is een goed hypertekst programma onontbeerlijk. Aangezien<br />

een dergelijk systeem door iedereen wordt bijgehouden, ligt het <strong>voor</strong> de hand om een <strong>revision</strong><br />

<strong>control</strong> system te gebruiken <strong>voor</strong> distributie, en onderhoud en status beheer. Het onderhoud van een<br />

dergelijk systeem is geen case study geweest bij het bedenken van <strong>Climbexion</strong>. Bij<strong>voor</strong>beeld: ik<br />

kan in dit hele epistel niets vinden over “overleg pagina's”. Het is daarom raadzaam om te kiezen<br />

uit <strong>voor</strong>handen version <strong>control</strong> systems, aan de hand van een checklist, of om een hypertekst tool te<br />

kiezen, met een ingebouwd <strong>revision</strong> <strong>control</strong> system.<br />

Eén van de aandachtspunten is het selecteren van een context. Bij<strong>voor</strong>beeld:<br />

● Tijdschrijven wordt in elke afdeling gedaan, maar overal net iets anders<br />

● Debuggen in het ene project werkt met een andere debugger dan in het andere<br />

Als je dit systeem gebruikt is het misschien raadzaam om een profiel van de gebruiker en het<br />

gebruik op te geven alvorens te zoeken op een onderwerp als tijdschrijven of debuggen. Dank zij<br />

het profiel wordt je vraag naar “debugger” vertaald in: “de debugger van project X”. Je hoeft dan<br />

niet te vragen naar “debugger D”. Het recepten boek vertelt je dan om te beginnen, dat je “debugger<br />

D” moet hebben.<br />

Pagina: 196 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

De structuur van <strong>Climbexion</strong> is waarschijnlijk niet adequaat, er zijn diverse onderwerpen die niet<br />

gerelateerd zijn aan packages, teams en subprojects.<br />

In de periferie van dit systeem, bereikbaar via links bevinden zich de cursussen, presentaties,<br />

manuals en zo, die zouden mogelijk ook in een <strong>revision</strong> <strong>control</strong> system horen, dit pleit weer <strong>voor</strong><br />

een onafhankelijk versie-beheer systeem, los van het hypertekst tool.<br />

Dit tool maakt geen deel uit van <strong>Climbexion</strong>. Een volledig en volwassen <strong>Climbexion</strong> zou misschien<br />

uiteindelijk ook de Wikipedia soort samenwerking moeten kunnen faciliteren.<br />

In NXP en in Philips-CE wordt een dergelijk systeem bijgehouden.<br />

Communicatie<br />

Mail, chat, twitter, blogs, web pages, chatrooms, audio/visual telefoneren en vergaderen: dit maakt<br />

geen deel uit van <strong>Climbexion</strong>.<br />

2.8.9 Gebruikersvriendelijke? id's<br />

Party, Team, Project<br />

NXP heeft een probleem: de ontwikkelingen in design teams en design-in teams in Eindhoven<br />

vinden plaats in één gebouw. Ook alle vertegenwoordigers van clients worden ontvangen in dit<br />

gebouw, en een aantal van hen moet soms toegang hebben tot de test plekken waar hun televisies<br />

staan opgesteld. Het is niet de bedoeling dat ze daar bij NXP op de hoogte worden gebracht van de<br />

activiteiten en ontwikkelingen van hun concurrenten.<br />

Tot mijn achtste jaar heb ik gewoond in de Lijsterbesstraat. Dit is een klein kronkelig straatje dat<br />

begint bij het kruispunt met de Essenstraat links, en de Glaslaan rechts, en de Kastanjelaan<br />

ertegenover. Het straatje komt uit in de Philips de Jonghlaan. We woonden tegenover de bakkerij.<br />

Wat geeft nu de naam Lijsterbesstraat precies aan informatie prijs? Wel als je “Lijsterbesstraat"<br />

tegen mij zei wist ik het precies: het was de straat waar ik woonde, niet al te ver van het spoor en<br />

de glaspoort van het Philips complex "Strijp I". Een Eindhovenaar weet dat het waarschijnlijk in<br />

het Philipsdorp ligt, net als de Iepenlaan en de Acasiastraat. Maar de meeste mensen zegt het niets.<br />

Je kunt vermoeden dat er lijsterbessen groeien, maar dat hoeft niet per se. Aan de naam kun je niet<br />

zien dat er een bakkerij gevestigd was, of dat ik er gewoond heb. Het feit dat het een straat is en<br />

geen laan zegt wel iets, misschien niet over de huidige status, maar wel de status van de weg toen<br />

de naam bedacht werd. Ondanks het feit dat het hier een "niet zinvolle naam" betreft (behalve dan<br />

het woord “straat”) is iedereen tevreden met de naam, en degenen die het aangaat weten wat<br />

ermee bedoeld wordt.<br />

Stel je noemt een project: “Sony Pnx315Chip USA”, dan hebben we het over een zinvolle naam. Je<br />

ziet wie de client is, welke chip gebruikt wordt en dat het project bedoelt is om een televisie in de<br />

Verenigde Staten van Noord Amerika in de markt te zetten. Misschien is er nog wel een zinvollere<br />

naam te bedenken die nog meer informatie bevat.<br />

Pagina: 197 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

Eindhoven, 5 december<br />

Beste Pleegbaas,<br />

Het doet mij genoegen u mede te delen dat het project<br />

LG-EU-MidRange-Internet-SuperSharp morgen klaar<br />

is<br />

Groeten,<br />

inhuurkracht <strong>Henk</strong><br />

Typisch rondslingerende informatie<br />

In een omgeving waar discretie vereist<br />

is is het maar beter om een niet<br />

zinvolle naam te gebruiken, zodat<br />

rondslingerende informatie niet<br />

meteen alles prijsgeeft aan niet<br />

ingewijden. Een thema naam is dan<br />

een lichtgewicht bijdrage aan de<br />

discretie, en een laatste barrière als de<br />

geëigende maatregelen falen. Voor<br />

projects kies je bij<strong>voor</strong>beeld mieren<br />

als thema. De projects heten dan:<br />

“Formica rufa” (Rode bosmier,<br />

beeldmerk: een rode mier in het bos),<br />

“Lasius Flavus” (Gele weidemier), “Myrmica rubra” (Knoopmier). Voor teams kies je namen uit<br />

een ander thema (ook <strong>voor</strong> de teams van andere parties) en zelfs <strong>voor</strong> parties kun je je bedienen van<br />

thema namen. Geen naam geeft iets prijs behalve dat het een project, een team, of een party betreft.<br />

Dit kan natuurlijk alleen als je systemen en tools dergelijke namen toestaan. <strong>Climbexion</strong> moet nog<br />

gemaakt worden, dus ik ga er<strong>voor</strong> zorgen dat het kan.<br />

Stel je kiest nummers <strong>voor</strong> teams, projects, en parties. Dan bestaat er toch een kans dat zingeving in<br />

de identifiers sluipt. Team 1831502 leest dan bij<strong>voor</strong>beeld als 18_315_02: 18: Toshiba, 315: chip<br />

PNX315, 02: Mips.<br />

Dergelijke names worden het best uitgegeven door een party. Er zijn dan diverse names in omloop<br />

<strong>voor</strong> hetzelfde project, hetzelfde team, en dezelfde party. Iemand kent alleen de betekenis van de<br />

names waarmee hij te maken heeft: men kent elkaars aanduidingen <strong>voor</strong> zover nodig. <strong>Climbexion</strong><br />

moet in staat zijn om met dergelijke synoniemen te werken. In een team ziet je dan uitsluitend de<br />

eigen codering van projects, parties en teams. Ook kan het zijn, dat bepaalde gegevens in<br />

bij<strong>voor</strong>beeld envelopes zoals herkomst informatie niet beschikbaar worden gesteld buiten het eigen<br />

team.<br />

Als een thema verveelt kun je overstappen op een ander thema, ook de synoniemen die uit een<br />

dergelijke overgang <strong>voor</strong>tkomen mogen geen probleem zijn <strong>voor</strong> <strong>Climbexion</strong>.<br />

Snapshots<br />

Bij snapshots heb je te maken met een drawer (of een package), en de inner-reach van die drawer<br />

(of dat package). Je kunt het snapshot nader specificeren met een timestamp of ook aanduiden met<br />

een baseline name of een tag name. Timestamps zijn nogal lang ten opzichte van tag names en<br />

baseline names.<br />

Ieder is vrij om names te bedenken <strong>voor</strong> Tags en Baselines: het zijn element names. Ze zijn net zo<br />

zinvol en kort als je wenst. Toevoegingen als drawer, package en project aan de name zijn<br />

overbodig want die hebben reeds de context bepaalt, waarin de snapshot aanduidingen gebruikt<br />

worden. Bij<strong>voor</strong>beeld als je vraagt: wat is de laatste baseline van package S in masterproject MP,<br />

dan verwacht je als antwoord: “baseline 3.2”, maar niet: “Package S, Masterproject MP Baseline<br />

3.2”<br />

Snapshot aanduidingen hoeven dus niet “globally unique” te zijn.<br />

Pagina: 198 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

Timestamp: 10 augustus 2008, 18:12:31 (27): erg veel<br />

Tag 10 augustus 2008, A.M: redelijk<br />

Baseline Week 32 2008 Kort, maar een vertaalslag naar<br />

gregoriaanse kalender is nodig <strong>voor</strong><br />

veel mensen<br />

14 Nog korter, in principe een niet zinvolle<br />

naam, maar <strong>voor</strong> ingewijden<br />

betekenisvol.<br />

R3.2 3: laatst bereikte officiële mijlpaal, 2:<br />

volgnummer<br />

Een timestamp als snapshot is uitsluitend geldig <strong>voor</strong> de drawer, maar baselines en tags zijn<br />

overdraagbaar van de ene naar de andere drawer. Echter om bruikbaar te zijn buiten de original<br />

drawer moet de target drawer gesynchroniseerd zijn met een query waarin de baseline of tag<br />

gebruikt is. Voor de weergave van datum en tijd van een timestamp wordt de default van de<br />

betreffende desktop of laptop gebruikt. Misschien kun je kiezen <strong>voor</strong> een file system met een<br />

nauwkeuriger timestamp dan de huidige één seconde.<br />

Events en Course items<br />

Events kunnen worden aangeduid met een timestamp. De items die door een event toegevoegd<br />

worden aan de course van een element krijgen een additioneel nummer. Als tweede identifier <strong>voor</strong><br />

zo'n item kan een sequence number gebruikt worden. Item sequence nummers kunnen dan gebruikt<br />

worden ter oriëntatie in de course van een element. Voor oriëntatie in een drawer kan men zich<br />

immers al bedienen van snapshot aanduidingen. De nummering vindt plaats per element (per kin<br />

per drawer)<br />

Kins<br />

Kins worden geïdentificeerd met behulp van een global unique identifier. Dit is niet erg<br />

gebruikersvriendelijk. Maar referentie vindt indirect plaats. De name van een element in een folder<br />

in een working-tree geeft bij<strong>voor</strong>beeld toegang tot de kin, maar je moet wel een <strong>Climbexion</strong> tool<br />

gebruiken om de working-tree te benaderen. Kin referenties blijven intact omdat projects uit elkaar<br />

ontstaan, door packages of hele drawers te kopiëren vanaf design projects, of vanaf design-in<br />

projects van dezelfde client.<br />

Kins van packages worden opgenomen in de eigen pools, en hebben in ieder geval een referentie in<br />

de administrator database.<br />

Elements<br />

Een element wordt geïdentificeerd door een drawer en een kin. Maar toegang krijg je door het<br />

gebruik van een name in een folder in een working-tree, of info-tree of snapshot (virtual info-tree).<br />

In feite door middel van een path-name.<br />

Pagina: 199 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

Versions<br />

Voorlopig houdt ik het er maar op het volgende : ze worden geïdentificeerd met een eigen identifier.<br />

Voor de eigen identifier wordt tegenwoordig een cryptografische hash van hun inhoud genomen. Ik<br />

meen dat Monotone hiermee is begonnen. Er is een traditie om deze files op te slaan in de vorm van<br />

delta's ten opzichte van hun <strong>voor</strong>ganger in een verzamel tekst file, tenminste ik meen dat ik dat ooit<br />

gezien heb bij PVCS. Voor een eerste aanzet van <strong>Climbexion</strong> is deze compressie techniek nog niet<br />

nodig, en misschien wel nooit. In één package kunnen in een snapshot identieke versions<br />

<strong>voor</strong>komen in verschillende files, die niet tot dezelfde kin behoren. Deze worden dus maar één keer<br />

opgenomen, immers hun hash is hetzelfde. Door de inhoud uit te breiden met de kin id en ook<br />

daarover de hash te bepalen kan dit vermeden worden, maar de vraag is of dat nodig is. Een rare<br />

consequentie kan zijn, dat je een version vastlegt in je satellite, en prompt krijgt hij een andere<br />

“timestamp last changed”, omdat hij gelijk is aan een bestaande version. De vraag is of je dat moet<br />

vermijden door de inhoud uit te breiden met de timestamp: er kan een merge door worden uitgelokt,<br />

die feitelijk overbodig is. Bij versions hoort metadata in de vorm van attributes. Deze attributes<br />

zoals timestamp en user-id zouden niet moeten bijdragen aan de hash, zodat er geen overbodige<br />

kopieën worden opgenomen in de pool.<br />

versions worden als volgt gekozen:<br />

● via de course van een file.<br />

● Door het gebruik van een name in een folder in een snapshot, of working-tree.<br />

● Door referentie vanuit een envelope.<br />

Drawers<br />

Hun duiding: een type aanduiding zoals “team-drawer”, “import-drawer”, “export-drawer”, “expose<br />

drawer full”, “expose drawer restricted”. Dit alles is niet eenduidig. Een project name hoort erbij, en<br />

soms een package name. Die project name betreft dan het subproject waar deze name betrekking op<br />

heeft. Satellites worden aangeduid met hun center en een additionele (user) name, of door een<br />

center een additionele name en een reference naar een work-item. Drawers zijn waarschijnlijk een<br />

file of een folder of beide. Als zodanig worden ze ook geïdentificeerd door een URL. Drawer type<br />

aanduiding en subproject samen specificeren de constellation.<br />

Envelopes<br />

Envelopes krijgen een sequence number. Samen met een constellation is dit een unieke aanduiding.<br />

External envelopes<br />

Binnen het master project krijgen ze een sequence number.<br />

2.8.10 Losse eindjes<br />

Opslag en afvinken van merge conflict lijstjes.<br />

Opslag van scripts (bij<strong>voor</strong>beeld <strong>voor</strong> Import limitations).<br />

Opslag van templates.<br />

Opslag van definities en data betreffende filetypes, file subtypes, file extensies, file gerelateerde<br />

Pagina: 200 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.8 Overige aspecten<br />

tools, backward en forward compatibility.<br />

Vastleggen van entiteiten en entiteitsvertalingen.<br />

Structureren van Other-focused file pools.<br />

Pagina: 201 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.9 Slotopmerkingen<br />

2.9 Slotopmerkingen<br />

Het gebruik van locations: Het is de bedoeling dat dit de security bevorderd, maar ook dat het<br />

extensible en flexible is. En dat het de mogelijkheid creëert om te werken met abonnementen op<br />

bestaande database servers en file servers, of om als organisatie deze servers aan te schaffen. Voor<br />

de file servers waarin versions zijn opgeslagen geldt: een directory structuur is niet per se nodig,<br />

maar support van de security die <strong>Climbexion</strong> vereist moet geïmplementeerd zijn. Ook is support<br />

van file forks gewenst om metadata te implementeren. Voor drawers, en pools van kins, en van<br />

envelopes geldt waarschijnlijk dat een database server volstaat.<br />

Compressie technieken van de file server kunnen misschien wenselijk zijn, bij<strong>voor</strong>beeld als de<br />

hoeveelheid software en data harder groeit dan de hoeveelheid opslagruimte, als die dan duur en/of<br />

schaars wordt. <strong>Climbexion</strong> kent de base waaruit een nieuwe version is ontstaan, In het begin wordt<br />

deze informatie niet vastgelegd in het filesysteem. in de toekomst zou een filesysteem met “delta”<br />

compressie in principe mogelijk zijn, als daarin <strong>voor</strong> elke successor één of alle bases worden<br />

vastgelegd.<br />

Toestaan dat wijzigingen van name en folder membership mogelijk zijn binnen een kin, en zelfs<br />

binnen een course, is zo'n beetje een uitdaging. In dergelijke gevallen een nieuwe kin beginnen is<br />

natuurlijk te simpel. Voor een tool dat folder structures synchroniseert zoals robocopy of <strong>voor</strong><br />

commander software en directory compare software is dit mogelijk een probleem. Voor de<br />

ontwikkeling van <strong>Climbexion</strong> betekent dit dat je niet zomaar een van deze programma's kan<br />

pakken, en dan de inputs en outputs ervan vervang door access op drawer snapshots en tips. Voor de<br />

gebruiker betekent het dat er meer vrijheid is om namen of indelingen te wijzigen, terwijl de<br />

methode om te synchroniseren intact blijft. In <strong>Climbexion</strong> ligt de grens bij het package, als je een<br />

element verhuist buiten het package, dan moet er een nieuwe kin komen.<br />

De log die bijgehouden wordt door de course van een envelope is in de eerste plaats bedoeld om bij<br />

te houden wat er is nodig geweest om een oplossing volledig in de repository te krijgen. Ook kun je<br />

daarin nagaan hoe het verloop van een changeset is geweest door de overdrachten heen. Deze<br />

informatie kan van pas komen <strong>voor</strong> het verbeteren van procedures, maar ook <strong>voor</strong> het vinden van<br />

een fout-oorzaak.<br />

De courses van eigen elements in de eigen drawers zijn uitgebreider dan de courses in die waarin de<br />

elements zijn gedistribueerd en overgedragen. Deels komt dit de zakelijkheid ten goede, deels de<br />

besproken discretie want dit verbergt mogelijk enig inefficiënt handelen, dat iemand niet aan de<br />

grote klok wil hangen. Evaluaties ten behoeve van product-verbeteringen zijn uitvoerbaar in<br />

drawers met geëxposeerde elements. Voor evaluaties ten behoeve van werkwijze (of gedrag)<br />

verbeteringen gebruik je meer lokale drawers en satellites. Ze staan ten dienste van degenen die hun<br />

eigen werkwijze willen of moeten verbeteren. Dit principe wil ik er eigenlijk wel inhouden, bij<br />

herzieningen van de paradigma. Bij proces of gedrag moet je bij<strong>voor</strong>beeld denken aan tekenen van<br />

besluiteloosheid: de envelope wordt wel/niet/wel ingevoerd; of tekenen van halve oplossingen: een<br />

envelope is in drie fasen gewijzigd, <strong>voor</strong>dat de oplossing klaar was; of transfer problemen:<br />

regelmatig komt het <strong>voor</strong> dat de daily build mislukt, of de acceptatie test.<br />

Dezelfde gegevens die dienen <strong>voor</strong> werkwijze verbeteringen kunnen van belang zijn om de oorzaak<br />

van een fout te achterhalen. Als blijkt dat iets is fout gegaan door een wijziging van Lagus, dan kan<br />

Lagus met hulp van zijn satellite mogelijk de oorzaak van de fout achterhalen. Zelfs als de oorzaak<br />

Pagina: 202 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.9 Slotopmerkingen<br />

niet direct is af te leiden, dan kan de registratie in de satellite het geheugen opfrissen en zo<br />

bijdragen aan inzicht in de oorzaak. Als de oorzaak bekend is kan dat aanleiding zijn tot een<br />

verbetering van de kennis van Lagus, of tot verbetering van de manier waarop hij werkt, of de<br />

manier waarop in het algemeen wordt gewerkt, en tot een inschatting van mogelijk andere fouten.<br />

Er is nogal nadruk gelegd op discretie en geheimen en gentleman agreements en zo, maar ja dat<br />

hoort een beetje bij de aard van de elektronica industrie: de organisaties zijn rivalen, vaak moeten ze<br />

samenwerken en soms treffen ze elkaar als ze aan het shoppen zijn, bij<strong>voor</strong>beeld bij dezelfde chip<br />

fabrikant. Soms krijg je de indruk dat ze werken met patent genererende machines –, een paar<br />

honderd per dag of zo –, <strong>voor</strong> patenten waar<strong>voor</strong> ze geen licentie verstrekken, om zo de<br />

concurrentie te dwarsbomen. Effecten kunnen zijn dat een nieuwkomer met nieuwe ideeën geweerd<br />

wordt en dat idee over idee niet gerealiseerd wordt. Dit zijn twee bijdragen aan innovaties, en dus<br />

aan omzet. Voor de branch als geheel en daarom ook <strong>voor</strong> individuele competitors is openheid en<br />

licentie verstrekking waarschijnlijk beter, en product en fabricage geheimen zouden niet lang<br />

moeten duren.<br />

De synchronisaties die ik heb geschetst: initieel synchroniseren van een satellite, tussentijds “bij<br />

synchroniseren” van een satellite als een ontwikkeling wat lang duurt, synchronisaties vlak <strong>voor</strong> een<br />

transfer van een satellite naar een center-drawer, synchroniseren van een package uit een ander<br />

project. Deze synchronisaties vragen om een goede set commando's en hun parameters om precies<br />

weer te geven wat de bedoeling is. Deze en andere commando's behoren tot de “human computer<br />

interface” van het systeem, en moeten ontworpen worden in de fase “methodische probleem<br />

beschrijving”.<br />

Wat kan een prototype van <strong>Climbexion</strong> opleveren?<br />

● Methoden als Problem frames en Orm/Niam worden gebruikt <strong>voor</strong> een niet triviaal systeem<br />

op een manier die gepubliceerd kan worden, en wie weet misschien moeten ze er een beetje<br />

<strong>voor</strong> aangepast worden .<br />

● Het structureren van de informatie <strong>voor</strong>ziening met in acht neming van eisen van discretie<br />

volgens het model van Dorothy Denning: dit is fun <strong>voor</strong> de liefhebbers, als het tenminste<br />

niet te triviaal blijkt te zijn<br />

● Enige ervaring met temporele problemen kan worden opgedaan.<br />

De software die mogelijk <strong>voor</strong>tkomt uit mijn analyses is in principe niet (universeel) bruikbaar: ze<br />

is immers niet gebaseerd op een gedegen markt onderzoek. Het is dedicated software, <strong>voor</strong> een<br />

bedrijf dat lijkt op NXP's tv competence centers, en klanten die lijken op één van hun klanten ten<br />

tijde van pakweg 2001-2008, en gebaseerd op enkele schetsen van werkwijzen. Mogelijk is het<br />

verleidelijk om zo te structureren dat delen ervan hergebruikt kunnen worden <strong>voor</strong> domeinen<br />

waar<strong>voor</strong> andere eisen gelden dan ik beschreven heb. Maar persoonlijk ben ik een beetje allergisch<br />

<strong>voor</strong> het woord “ook”. Het klinkt naar slechtzittende tweedehands kleding: Het pak is gemaakt <strong>voor</strong><br />

Jan, maar Piet kan het “ook” aan.<br />

Binnen NXP heb ik gewerkt in een drietal teams. Waarschijnlijk is <strong>Climbexion</strong> geschikt binnen die<br />

teams. Voor de teams waarmee we samenwerkten en <strong>voor</strong> de andere teams in NXP gelden andere<br />

interne werkwijzen, en dus zijn er mogelijk andere varianten van een <strong>revision</strong> <strong>control</strong> system nodig.<br />

Voor de gegevens-uitwisseling zou het wel prettig zijn als opslag en transport gestandaardiseerd<br />

zijn, maar werkwijzen moeten kunnen variëren: er is mogelijk een zeer lange weg te gaan om te<br />

komen tot een commercieel product.<br />

Pagina: 203 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.9 Slotopmerkingen<br />

Vlak <strong>voor</strong> ik met pensioen ging (2008) gaf CE de Amerikaanse markt op, dat wil zeggen, dat ze de<br />

tv's lieten ontwikkelen door een Taiwanese firma. Het lukte NXP niet om zijn chip te verkopen aan<br />

die firma, dus dat was gevoelig verlies van marktaandeel. In 2011 kwam het bericht dat Philips CE<br />

helemaal ophield met de eigen fabricage van televisies. Het is best wel speculatief wat ik er hier<br />

over zeg. De aanpak met gemeenschappelijk ontwikkelen was goed en gaf een <strong>voor</strong>sprong toen er<br />

van scratch af aan begonnen moest worden, toen alles nog moest worden ontwikkeld en<br />

geïntegreerd. Later, toen er meer onderlinge zakelijkheid en plug en play vereist werd, zagen ze<br />

misschien geen kans die overgang te maken. Om in de gekozen cooperation projects toch een plug<br />

en play packages op te leveren is niet triviaal. Immers zonder harde verificatie is er geen garantie<br />

dat software aan een bepaald criterium voldoet: je moet er <strong>voor</strong>tdurend op <strong>control</strong>eren, en de<br />

gevonden problemen oplossen, zoals bij gewone bugs. Bij samenwerken is het verdelen van werk<br />

vaak een kwestie van onderhandelen. UHAPI alleen lijkt onvoldoende en CE heeft ook te maken<br />

met allerlei applicaties. <strong>Climbexion</strong> is, omdat het <strong>voor</strong>namelijk is gebaseerd product families en op<br />

samenwerking (zonder veel plug en play), misschien slechts optimaal bruikbaar in een zeer<br />

specifieke situatie. De les: in de pionier fase moet je reeds veel meer ontwikkelen <strong>voor</strong> plug en play<br />

en “independent deployment” in de volgende fasen.<br />

De werkwijze toen, kan veranderen. Bij<strong>voor</strong>beeld als “independent deployment” bereikt wordt, is<br />

minder samenwerking nodig. Als de programmeer taal C wordt opgevolgd door een moderne taal,<br />

dan zal dit mogelijk de teams kleiner maken, de betrouwbaarheid van de software vergroten, en zo<br />

de werkwijze veranderen. Iets soortgelijks geldt als men overgaat op vernieuwde best practices. Er<br />

is binnen NXP een trend gesignaleerd om steeds meer computers en processors te gebruiken in het<br />

moderne elektronische speelgoed, en niet slechts één steeds krachtiger. De werkwijze en mogelijk<br />

de samenwerking verandert als er met zeer veel computers gewerkt gaat worden. Voor digitale<br />

televisies geldt ook nog dat die in het begin veel innovaties vereisten, maar naarmate de tijd<br />

<strong>voor</strong>tschrijdt wordt het “meer van hetzelfde”, alleen goedkoper. Al deze veranderingen kunnen de<br />

behoefte aan bepaalde karakteristieken van een version <strong>control</strong> system veranderen.<br />

Kortom zonder goed empirisch onderzoek wordt het nooit wat, maar blijft het een hobby. Trouwens,<br />

als je met een tool wilt komen <strong>voor</strong> een bepaalde commerciële branch, zoals consumenten<br />

elektronica, dan zullen er standaards moeten worden afgesproken. Er zal moeten worden<br />

geparticipeerd door de ondernemingen in een commissie of zo, die de samenwerking en de tools die<br />

daarbij horen specificeert, en mogelijk de software tools uitgeeft. Ik denk wel dat dit open<br />

standaards en vrije software tools kunnen zijn, waardoor ze gemakkelijk en goedkoop beschikbaar<br />

zijn <strong>voor</strong> onderwijs, <strong>voor</strong> instappers, en buiten de branche.<br />

Een “bedreiging” van software <strong>revision</strong> systemen lijkt de ontwikkeling van de bestandssystemen<br />

ZFS en Btrfs / CRFS te zijn. Het lijkt erop dat dergelijke systemen met snapshots en branches<br />

rechtstreeks de opslag methode van <strong>revision</strong> <strong>control</strong> systems kunnen zijn. Voor <strong>Climbexion</strong> zou dan<br />

het drawer/pool opslag systeem uit de tijd raken. Ook het working-tree / view-tree idee zoals wij dat<br />

kennen gaat dan op de schop.<br />

Het prototype is zeker niet praktisch bruikbaar. Er zijn omissies zoals splitsen of samenvoegen van<br />

packages, opvolging van een package door een andere, integratie met een IDE en zo. Verder heeft<br />

een prototype een belabberde performance denk ik.<br />

Pagina: 204 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

2 Schets van het <strong>revision</strong> <strong>control</strong> system<br />

2.9 Slotopmerkingen<br />

Het werk van een kamergeleerde<br />

Zoals uit het plaatje blijkt is de pleister <strong>voor</strong>al<br />

bruikbaar <strong>voor</strong> lijf en leden van echte mensen<br />

Er is het gezegde: “het eerste huis bouw je <strong>voor</strong><br />

je vijand, het tweede <strong>voor</strong> je vriend, en het<br />

derde <strong>voor</strong> jezelf”. Zoiets zal ook wel gelden<br />

<strong>voor</strong> een software systeem. Het “eerste huis”<br />

zouden sommige bestaande <strong>revision</strong> <strong>control</strong><br />

systemen kunnen zijn. De eerste officiële versie<br />

van <strong>Climbexion</strong>, als het ooit zover komt, is <strong>voor</strong><br />

een vriend. Je moet natuurlijk wel jezelf aan<br />

banden leggen, tenminste als je één van de<br />

wetten van Brooks wilt overwinnen: “Het huis<br />

<strong>voor</strong> jezelf –, of misschien reeds dat <strong>voor</strong> je<br />

vriend –, komt nooit af, want je wilt het te goed<br />

doen en te mooi maken”. Maar ja aan de andere<br />

kant, dit is ook <strong>voor</strong> studie, en wat mij betreft<br />

<strong>voor</strong> de lol, en om de tijd te doden.<br />

Door andere bezigheden werk ik slechts 3<br />

dagen per week enkele uren aan dit stuk. Voor<br />

een ruwe schets van het <strong>revision</strong> <strong>control</strong> system<br />

en het gebruik ervan heb ik tot nu toe drie jaar doorlooptijd besteed. Nu begint een meer formele<br />

probleem beschrijving, met methoden waarmee ik nog niet eerder heb gewerkt. Als ik dat tenminste<br />

niet nog een jaar uitstel, ik zie nogal op tegen het formeel beschrijven. Ik ben waarschijnlijk te oud<br />

en te blasé om mij nog een methode eigen te maken zodanig dat ik ermee kan lezen en schrijven.<br />

Het lezen van een boek, en daarna in je eentje achter de PC ermee werken is niet meer de juiste<br />

manier <strong>voor</strong> mij om me de stuf eigen te maken. Uiteindelijk lukt mij slechts een informele<br />

beschrijving. Desalniettemin hoop dat u aan dit epistel enig plezier hebt beleefd.<br />

Wat ik wilde maken was een speeltuin waarin wat gespeeld kan worden met methodisch<br />

ontwikkelen van niet triviale systemen. Tot nu toe zat ik in mijn eentje achter mijn PC. In je eentje,<br />

dat kan uiteindelijk niet de bedoeling zijn van een speeltuin.<br />

Pagina: 205 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3 Methodische probleem beschrijving<br />

3 Methodische probleem beschrijving<br />

3.1 Inleiding<br />

3.1.1 ORM<br />

Dit is een “stappen methoden”<br />

De stappen in ORM worden gezamenlijk “Conceptual schema design procedure (CSDP)” genoemd:<br />

0. Splits het “universe of discourse” in handzame delen<br />

1. van <strong>voor</strong>beelden naar feit expressies en voer een kwaliteit <strong>control</strong>e uit<br />

a) Verwoordt bekende <strong>voor</strong>beelden (tot feiten)<br />

b) Verfijn ze tot formele elementaire feiten en verifieer deze<br />

2. Teken de feit typen en en maak er <strong>voor</strong>beelden bij van feiten<br />

3. Kijk of entity typen moeten worden gecombineerd en toon afleidingen<br />

4. Bepaal hoe feiten geïdentificeerd kunnen worden(uniqueness constraints), en <strong>control</strong>eer de<br />

de feit expressies op het aantal rollen (arity).<br />

5. Bepaal verplichte rollen, en <strong>control</strong>eer op logische afleidingen<br />

6. Bepaal de wetmatigheden (constraints) die gelden <strong>voor</strong> waarden en (entiteit) verzamelingen,<br />

en hoe verzamelingen zich onderling verhouden (deelverzameling, gelijkheid, exclusie)<br />

7. Bepaal de overige wetmatigheden en voer laatste <strong>control</strong>es uit.<br />

8. Integreer de subschema's in één globaal conceptueel schema<br />

De ORM aanpak met stappen zijn aantrekkelijk in een project-fase, planbaar, en <strong>voor</strong>tgang<br />

zichtbaar en zo. De methode lijkt strikt gebaseerd op bestaande praktijken, of concrete <strong>voor</strong>beelden.<br />

De schema's zijn een tussenproduct tussen de bestaande praktijk en de nieuwe database.<br />

In een bestaande praktijk zijn er bestaande reports, graphical user interfaces, command sets en<br />

dergelijke. Dus eigenlijk is er al een “extern schema” van de database, en ook een implementatie<br />

schema. In een nieuw bedacht systeem en zelfs in een overnieuw bedacht systeem moet dit nog zijn<br />

vorm krijgen, en is er mogelijk een kip ei probleem met het conceptuele schema.<br />

De information modeling techniek beschrijft “elementary fact types”. Deze zijn waarschijnlijk al in<br />

de vereiste normaal vorm <strong>voor</strong> temporele databases (6nf volgens Wikipedia), gewoon omdat ze<br />

elementair zijn. ;-)<br />

3.1.2 Problem frames<br />

Als je de inhoudsopgave bekijkt van het boek: “systeem ontwikkeling volgens SDM” van H.B.<br />

Eilers, ((ik heb de 8e druk) 1990 ISBN 90 6233 177 7 Academic Service) dan zie je onder meer het<br />

volgende:<br />

1.2 Verzamel gegevens over de bestaande situatie<br />

1.3 Analyseer de bestaande situatie<br />

1.4 Bepaal doeleinden en eisen nieuwe systeem<br />

Wat opvalt is het volgende: analyseren doe je een situatie, eisen stel je aan een systeem. Mijn<br />

aanpak is tot nu toe zo'n beetje:<br />

1.2 Inventariseer en analyseer de oude situatie<br />

Pagina: 206 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.1 Inleiding<br />

1.3 Ontwerp nieuwe situatie<br />

1.4 Bepaal doeleinden en eisen nieuwe systeem<br />

Waarbij de situatie zowel "het (version <strong>control</strong>) systeem" als de organisatie en werkwijzen betreft.<br />

Aan punt 1.4 zijn we nu bijna toe.<br />

Omdat het beschrijven van een nieuw version <strong>control</strong> systeem door mij, een ex software engineer,<br />

tot hobby gemaakt is, worden er mogelijk eisen gesteld die je normaliter in de design fase van de<br />

software tegenkomt. Maar ja, als "owner" mag je eisen wat je wilt, zelfs implementatie details. Dit<br />

komt natuurlijk niet alleen door mijn achtergrond. De "situatie" zowel oud als nieuw bestaat nu<br />

eenmaal uit beide de organisatie en het systeem, en nieuwe eisen kunnen aan elk onderdeel van de<br />

situatie gesteld worden en vandaar "gepropageerd" naar veranderingen in de hele situatie, en eisen<br />

aan alle onderdelen. Het eerste context diagram en de beschrijving ervan is een poging om dit in<br />

kaart te brengen. Maar daarna moet toch echt begonnen worden met punt 1.4: alles toespitsen op de<br />

nieuwe machine en de nieuwe database, volgens de methode beschreven door Michael Jackson.<br />

Het opvallendste probleem dat niet behandeld wordt door M.J. is de eis van distributie, van locaties<br />

waar een machine draait met databases, die mogelijk communiceert met identieke machines die<br />

conceptueel identieke databases gebruiken (waarvan de inhoud verschilt). Of van identieke<br />

machines die dezelfde databases benaderen. Misschien dat daar geïmproviseerd moet worden.<br />

3.1.3 JSP<br />

Hoe komen de <strong>voor</strong>beelden tot stand? In plaats van het ontwikkelen van een gebruikers interface, en<br />

van reports zal ik <strong>voor</strong>lopig uitgaan van batchfiles die beschrijfbaar zijn met Jackson's JSP<br />

schema's, of met reguliere expressies. Ik verwacht dat het mogelijk is, dat ze slechts een one read<br />

ahead procedure vereisen om ze te ontleden. Later kunnen de reports, de command language, en de<br />

GUI dan daadwerkelijk worden ontworpen, met lettertypen, kleuren, lay-out, porties, snapshots en<br />

dergelijke. Een JSP schema is dan de “structuur” van een sequentiële file met data. De dubbele<br />

specificatie, in de vorm van gepresenteerde <strong>voor</strong>beelden (views) enerzijds en conceptual schema<br />

anderzijds, die blijft dan gehandhaafd bij het toepassen van ORM. Waarom JSP schema's en<br />

batchfiles in plaats van XML schema's en XML files? Waarschijnlijk jeugd sentiment: wij<br />

gebruikten JSP in de jaren 70 als opvolger en uitbreiding van de balance-line methode uit de jaren<br />

60. Meer informatie over JSP schema's: “Principles of Program design” door M.A. Jackson<br />

(Academic Press 1975, ISBN: 0123790506 ). De verwachting is dat het merendeel van de<br />

<strong>voor</strong>beelden op deze manier te beschrijven is. Een enkele maal kan het <strong>voor</strong>komen dat “one read<br />

ahead” niet toereikend is, of dat een structuur niet met reguliere expressies is te beschrijven. Dan<br />

wordt er enigszins geïmproviseerd om de structuur te tonen.<br />

In Jackson schema's bestaat een strikte definitie van nodes: Een node is een leaf, een sequence, een<br />

iteration, of een aantal alternatives. Optional bestaat niet, in plaats daarvan is er het alternative: een<br />

node A is of een a of niets. Deze strikte definitie is nodig als alle input en output files gezamenlijk<br />

gebruikt worden om een procedure te construeren: men zoekt naar “matching”nodes. Stel dat de<br />

constructie “een A is een A1 gevolgd door een A2, A2 is een iteratie van a2” vervangen wordt door<br />

het minder strikte “een A is een A1 gevolgd door een iteratie van a2”, en A2 is een matching node,<br />

dan kan de methode niet uitgevoerd worden. Handig <strong>voor</strong> de communicatie over de structuren en<br />

het matchen is de naamgeving: iedere node heeft een label.<br />

In feite gebruiken we de JSP schema's als prototype <strong>voor</strong> een deel van de gebruikers interface.<br />

Pagina: 207 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.1 Inleiding<br />

Zodra de gebruikersinterface zelf gespecificeerd is, is het prototype overbodig. De strikte definitie<br />

van nodes maakt hopelijk dat de uiteindelijke interface kan worden vergeleken (kan matchen) met<br />

het prototype.<br />

JSP schema's beschrijven de syntaxis van een sequentiële file. Zo'n file wordt dus feitelijk gezien<br />

als een string met een “alfabet” Het alfabet waarmee de string wordt gemaakt, die voldoet aan het<br />

schema, bestaat uit “record-typen” of “tuple types”, ieder record-type heeft zijn eigen formaat: een<br />

opsomming van variables (fields, attributes, roles). Het Jackson schema zoals wij dat gebruikten<br />

ging dus niet door tot de laatste byte. De volgorde van de variables doen niet ter zake in een Jackson<br />

programma, want een record wordt altijd in zijn geheel gelezen in de meest gebruikte implementatie<br />

taal van JSP: Cobol. Deze volgorde is meestal wel belangrijk in <strong>voor</strong>gaande of volgende sorteerprogramma's:<br />

alle records worden gesorteerd op dezelfde posities. Nu we JSP schema's niet<br />

gebruiken <strong>voor</strong> een “batch” architectuur maar als prototype <strong>voor</strong> een gebruikersinterface, is het niet<br />

nodig om gemeenschappelijke sorteer velden te specificeren in de record-types.<br />

De “leafs” van een Jackson schema representeren de record typen. Dit is ongeveer waar. Leafs<br />

kunnen hetzelfde record formaat hebben, en toch semantisch onderscheidbaar zijn. Bij<strong>voor</strong>beeld,<br />

iemand wordt lid van een club en na een jaar zegt hij zijn lidmaatschap op. Er is dan een “join”<br />

event en een “leave” event. Deze events kunnen beide geregistreerd worden met het record formaat<br />

“event record”. Het attribute “event type” kan de waarden “join event” of “leave event” hebben. Er<br />

is dan geen 1-1 relatie tussen een record formaat en een leaf.<br />

Het is te verwachten dat de uiteindelijke presentaties zijn te “matchen” met de <strong>voor</strong>lopige JSP files.<br />

Jackson beschrijft een aantal conflicten die direct matchen onmogelijk kunnen maken. De<br />

belangrijkste is het volgorde conflict (order clash), die optreedt als een presentatie in een andere<br />

volgorde moet worden gemaakt of verwerkt dan de oorspronkelijke file. Als tweede is daar het<br />

interpretatie conflict (boundary clash): de volgorde stemt overeen, maar de structuur die je ziet in de<br />

ene string gegevens is niet vergelijkbaar met die van de andere string. Ten derde is er het meng<br />

conflict (interleaving clash), waarbij tenminste één der gegevens stromen gesplitst moet worden in<br />

meerdere die elk vrij van conflicten zijn ten opzichte van de andere stromen. Ik verwacht dat deze<br />

problemen doorgaans zijn te vermijden. Mochten ze toch optreden, dan zullen we de door Jackson<br />

aanbevolen oplossingsmethode gebruiken, en zo alsnog aantonen dat de <strong>voor</strong>lopige en de<br />

uiteindelijke presentaties verwant en gelijkwaardig zijn.<br />

3.1.4 HCI<br />

Onlangs heb ik bij “de Slegte” het boek gekocht: Human Computer Interaction: Issues and<br />

Challenges. Qiyang Chen (Idea Group Publishing, ISBN 1-8782889-91-8)<br />

De eerste 3 hoofdstukken heb ik inmiddels enigszins gelezen.<br />

In hoodstuk1: Interface Design: An Embedded Process for Human Computer Interactivity; Antonio<br />

Drommi, vond ik onder meer een “Audience checklist”, en een sectie “Diversity and cultural<br />

elements”: verscheidenheid van gebruikers moet leiden tot standaarden en opties van de gebruikers<br />

interface. Een consequentie is dat de verzameling opties moet worden gespecificeerd, gemaakt en<br />

gebruikt. Voor het een eerste aanzet kan worden uitgegaan van een homogene eentalige gebruikersclub<br />

denk ik.<br />

In hoodstuk2: User Interface Development Throughout the System Development Life-cycle; Scott<br />

Pagina: 208 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.1 Inleiding<br />

Ambler. Hier vond ik een methode <strong>voor</strong> het ontwikkelen van modellen van “major en minor user<br />

interface elements” met behulp van flipovers en sticky notes, en een user interface flow diagram.<br />

De documentatie-wijze kan ik adopteren in mijn requirement specifications, maar snapshots ervan<br />

moeten dan toch elektronisch worden vastgelegd, zodat de ontwikkelingsgang is te volgen.<br />

Misschien is het mogelijk om hetzelfde te doen met een case tool (en een beamer, als men met<br />

meerdere mensen tegelijk aan het ontwerpen is).<br />

In hoofdstuk 3: From HCI to Interaction Design. Jonas Löwgren. Hier vond ik de bewering dan<br />

HCI meer is dan een software laag. Dat is natuurlijk waar. Begrippen als team, kin course,<br />

envelope, patch dringen in het systeem door tot in de database, maar zijn ook in gebruik bij de<br />

mensen. Ook werd hierin uitgelegd dat HCI niet rechtlijnig is te ontwikkelen (van requirement tot<br />

implementation), maar een leer-proces doormaakt waarbij het uiteindelijke resultaat niet meer is<br />

geënt op de oorspronkelijke requirements (dit idee bestond ook reeds in de <strong>voor</strong>gaande<br />

hoofdstukken). Voor een eerste aanzet zou je zo rechtlijnig mogelijk te werk te moeten gaan, daarna<br />

mag er naar hartenlust geïtereerd, geleerd, en geëxperimenteerd worden, maar liefst wel van<br />

“werkend geheel” naar “werkend geheel”.<br />

Veel van de begrippen die gehanteerd worden in <strong>Climbexion</strong> zijn reeds gemeengoed in het<br />

toepassingsgebied. Anderen zijn nieuw of vernieuwd door <strong>Climbexion</strong>. In de loop der ontwikkeling<br />

kan blijken dat dingen niet ongewijzigd zijn te handhaven. Met name het wilde idee om lokale<br />

namen te gebruiken <strong>voor</strong> projects, parties en teams zou best kunnen sneven omdat het onpraktisch<br />

is. (In dit stadium, – waarin de SCM systemen “eilanden” van automatisering zijn, die in gebruik<br />

zijn binnen teams en parties –, is het trouwens gebruikelijk). Maar ja, nu we toch een leerproces<br />

moeten ondergaan kunnen we het wel een kans geven. Mocht in de loop der ontwikkeling blijken<br />

dat er geen praktische invulling kan worden gevonden <strong>voor</strong> het idee dan schrappen we het.<br />

Database onderhoud, onderhoud van optie verzamelingen: het basis frame van Jackson is het<br />

workpieces frame. Een GUI lijkt een <strong>voor</strong>traject , waarin de “commands” en “notifications”<br />

geselecteerd en gevormd worden die worden losgelaten op de “workpieces”. Ook zaken als<br />

scrollen, copy/paste, view-modes en dergelijke blijven mogelijk buiten beeld in het basis frame<br />

door de behoefte om “essentials” te registreren in de requirements. De methode van Scott Ambler<br />

specificeert dit <strong>voor</strong>traject. Uitgangspunt <strong>voor</strong> de user interface is het resultaat van ORM en de<br />

workpieces frames.<br />

Niet uit een boek, maar van mijzelf. Wat is de overeenkomst tussen TV software, database software<br />

en repository software?<br />

● Ze hebben een gebruikers interface. Ja logisch dat weten we ook wel.<br />

● Ze zijn een gebruikers interface. TV software is een interface naar TV hardware, database<br />

software is een interface naar een database, repository software is een interface naar een<br />

repository. Ja logisch, dat weten we ook.<br />

Ik wilde je er toch maar even aan herinneren.<br />

Pagina: 209 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.2 Context diagram<br />

3.2 Context diagram<br />

● Parties:<br />

Teams, Projects, Product families en Products worden erin benoemd.<br />

Security en confidentiality worden geëist door parties. De vereiste security omvat export<br />

limitations, access rights, Backup en recovery, inbraak beveiliging, en dergelijke.<br />

Samenwerken wordt afgesproken door parties.<br />

Een team binnen NXP bedient vaak een deel van de parties, vaak één, soms twee, van de<br />

klanten waarmee samen een nieuwe generatie chip / tv wordt ontworpen, of veel van de<br />

parties die daarna de chip willen afnemen.<br />

● HW / SW architectuur:<br />

Packages en Components in een (general) framework worden benoemd en bijgehouden<br />

door de architecten. De eis dat <strong>Climbexion</strong> packages moet kennen komt hiervandaan.<br />

Ook de eisen <strong>voor</strong> het registreren van folder entity types komt <strong>voor</strong>namelijk <strong>voor</strong>t uit de<br />

architectuur, zoals bij<strong>voor</strong>beeld “component folder”, “interface folder”, “publieke<br />

componenten folder”, “unit-test folder”.<br />

De packages en components bepalen ook mede de teams en roles <strong>voor</strong> persons. Packages<br />

zijn atomen <strong>voor</strong> de teams, en components zijn soms atomen <strong>voor</strong> component owners.<br />

Atomen: je beheert nooit 2,77 package, maar altijd een geheel aantal.<br />

● Product families:<br />

Ze worden bepaald door de parties.<br />

Pagina: 210 / 230<br />

Domains and Requirements


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.2 Context diagram<br />

Product family members zijn gerelateerd aan projects. Een member uit de TV family<br />

bevat één member uit de chip family en bepaalt vaak een master project. Zo'n member<br />

kent vaak nog wel varianten: er is bij<strong>voor</strong>beeld een eco chip en een power chip, zodat<br />

een Europese eco TV, een Zuid-Amerikaanse power TV samen in hetzelfde<br />

masterproject ontworpen kunnen worden.<br />

“Adopt” wijzigingen zijn een vereiste als je werkt met product families, tenminste als je<br />

software ontwikkeld per familielid.<br />

● Projects:<br />

Een subproject bedient één master projects en bestuurt daartoe één team. Ze zijn een<br />

entity <strong>voor</strong> administrations en misschien <strong>voor</strong> <strong>Climbexion</strong>. Door de subproject structuur<br />

van een master project zijn er baseline en patch overdrachten van de software.<br />

Project management wil alle personen optimaal en tegelijkertijd aan het werk hebben, en<br />

onderling wachten beperken. Daaruit volgen eisen <strong>voor</strong> base/labored paren, eisen van<br />

mergeability van source files, het eisen van een center/satellite structuur en de eis om<br />

other-focused files te onderkennen.<br />

Kwaliteit waarborgen bij overdrachten worden in het kader van project management<br />

gespecificeerd, en ingevoerd. Hieruit volgen eisen <strong>voor</strong> tests, reviews, gebruik van tools<br />

<strong>voor</strong> statische analyses en gebruik van build tools <strong>voor</strong>dat wordt overgedragen.<br />

Ook wil ze product en onderdelen identificeren, en er de status en <strong>voor</strong>tgang van kunnen<br />

vaststellen.<br />

Verschillen tussen subprojects <strong>voor</strong> wat betreft de software engineering cultuur, kunnen<br />

leiden tot verschillen in case tools. Hieruit kan de volgende eis afgeleid worden: Het<br />

moet mogelijk zijn om build resultaten op te slaan, want subproject A zal soms met<br />

andere talen en compilers of andere design tools werken, dan subproject B, waardoor ze<br />

elkaars build resultaten niet kunnen (of willen) genereren.<br />

● Teams:<br />

Ze bedienen meerdere subprojects, en bij NXP meestal slechts één lid, soms enkele<br />

leden van de eigen product family.<br />

Ze beheren enkele packages <strong>voor</strong> de betreffende leden van de product family.<br />

Teams die meewerken aan een gezamenlijke ontwikkeling beheren vaak enkele van de<br />

packages van NXP. Meestal bedienen ze subprojects <strong>voor</strong> een klein deel van de cliënten.<br />

Teams, die werken <strong>voor</strong> de parties die daarna de chip afnemen, beheren vaak alle<br />

packages van NXP.<br />

Teams en de rolverdeling van personen binnen teams zijn belangrijke entiteiten <strong>voor</strong><br />

administrations, <strong>voor</strong> de specificatie van access rechten.<br />

● Person:<br />

Persons horen normaal in één team, maar kunnen “uitgeleend” zijn aan andere teams,<br />

zodat ze soms hun tijd verdelen tussen meerdere teams.<br />

Ze zijn geregistreerd in de administrations, en hebben access rechten in de repositories.<br />

Bij elke wijziging in <strong>Climbexion</strong> wordt de persoon die de wijziging teweegbrengt<br />

geregistreerd.<br />

Software engineers willen self-focused files opslaan, en test engineers willen daarnaast<br />

nog allerlei other-focused file opslaan, zoals test-results en allerlei status reports.<br />

● Temporal database design:<br />

Deze wetenschap levert de begrippen valid time en transaction time, die gebruikt worden<br />

in <strong>Climbexion</strong> en in Administrations.<br />

Pagina: 211 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.2 Context diagram<br />

Snapshot registraties en snapshot queries komen hieruit <strong>voor</strong>t.<br />

● Case tools:<br />

Merge tool: dit moet gebruikt kunnen worden in <strong>Climbexion</strong> repositories.<br />

Build tool: dit tool moet op “different time” zijn gebaseerd, want gegenereerde code<br />

moet worden opgeslagen in <strong>Climbexion</strong> om export limitations te realiseren, om optimaal<br />

werken te realiseren, en om verschillen tussen teams <strong>voor</strong> wat betreft case tools te<br />

overbruggen<br />

Build tool: het build tool stelt een eis aan het file system, misschien aan alle tools die<br />

files wijzigen, en aan <strong>Climbexion</strong>, als het werkt met “different version identifier”<br />

(checksum, hash) als alternatief <strong>voor</strong> “different timestamp”.<br />

Een IDE heeft vaak faciliteiten <strong>voor</strong> het onderhouden van de tip van de satellite, en de<br />

working-tree. En om een info-tree te onderhouden en af te leiden van een snapshot van<br />

een drawer.<br />

Tools leveren de filetypes en file entity types, de viewers, editors, en mogelijk een deel<br />

van de templates. Ook behoren tot de tools de template wizards, die aan de hand van<br />

ingevulde menu's de template genereren.<br />

Files zoals vervaardigd door een tool dat in gebruik is <strong>voor</strong> het ene project kan<br />

incompatibel zijn met het tool van een ander project. Dus is een eis aan <strong>Climbexion</strong> om<br />

compatibiliteit checks uit te voeren bij “adopt” operaties.<br />

Tools worden gebruikt <strong>voor</strong> “quality assurance” na wijziging of merge om zo een<br />

bepaalde status van bruikbaarheid te garanderen <strong>voor</strong> de versions in de repository.<br />

Teams en personen moeten kunnen werken met meerdere generaties van een tool<br />

tegelijk, op dezelfde computer.<br />

● Het File system:<br />

Dit systeem levert de begrippen “file”, “folder”, “soft-link” en eisen die aan de<br />

identificatie van files, folders en soft-links worden gesteld.<br />

working-trees en info-trees zijn gerealiseerd in het file system.<br />

● Geography:<br />

Hier komt het begrip “location” vandaan . Het geheel aan drawers en pools, is verdeeld<br />

over (netwerk) locations. Een drawer of een pool staan slechts op één location.<br />

Teams zijn gebonden aan een verdieping in een gebouw: een (ruimtelijke) location,<br />

Parties bevinden zich op soms op meerdere locations. Ruimtelijke locations bezitten<br />

vaak een intranet, waarin zich de netwerk locations bevinden.<br />

Netwerk locations zijn computers, met permanent geheugen. Een gedeelte van dit<br />

geheugen is in gebruik <strong>voor</strong> <strong>Climbexion</strong>, omdat daar een deel van de repository staat.<br />

Personen kunnen een laptop bezitten. Terwijl de persoon zich verplaatst, verplaatst de<br />

netwerk location van zijn laptop zich. Toch wordt zijn laptop beschouwd als de vaste<br />

location waarop een deel van de repository staat.<br />

Het bestaan van <strong>Climbexion</strong> locations stelt eisen aan de manier waarop kins en versions<br />

gecodeerd worden. In geval ze met zijn allen in één location ontstaan, kun je met<br />

sequence nummers werken, maar bij het gebruik van meerdere locations, waarvan een<br />

aantal mogelijk niet tijdig bereikbaar, moet je een andere manier van coderen gebruiken.<br />

(een (cryptografische) checksum of hash of een timestamp of beide <strong>voor</strong> een version,<br />

een guid <strong>voor</strong> kins). Hoewel de identifiers gegenereerd worden, zijn ze geenszins<br />

verborgen <strong>voor</strong> gebruikers: ze maken deel uit van hun wereld.<br />

Het bestaan van <strong>Climbexion</strong> locations stelt eisen aan de manier waarop wijzigingen<br />

Pagina: 212 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.2 Context diagram<br />

moeten worden doorgevoerd. Voor wijzigingen met een course of development zijn de<br />

overdrachten primair georganiseerd van en naar drawers, en extra, vanwege de locations,<br />

de wijzigingen van pools. Voor wijzigingen die een course of corrections vormen zijn<br />

extra maatregelen nodig om ze door te voeren. Met name als ze deel uitmaken van een<br />

pool. (upload naar een centrale pool, download naar locations).<br />

● Security methods:<br />

Globally Unique Identifiers, Secure Hashes: de algoritmen hier<strong>voor</strong> zijn standaard. Ze<br />

worden onder meer gebruikt <strong>voor</strong> file versions en kins. Hashes worden ook gebruikt bij<br />

elektronische handtekeningen.<br />

Origin warrant met private en public keys over secure hashes. Ze worden gebruikt in<br />

envelopes, bij baselined packages, bij aanmeldingen en dergelijke<br />

Access permissions op drawers pools, servers en dergelijke.<br />

Classification methods. Ze worden gebruikt als geheimen niet verstuurd mogen worden,<br />

of niet toegankelijk mogen zijn <strong>voor</strong> iemand, terwijl het betreffende deel van de<br />

repository wel toegankelijk is.<br />

● Source files en Test-scripts:<br />

Source files zijn de klassiekers: version <strong>control</strong> systemen zijn oorspronkelijk bedacht om<br />

die erin op te bergen.<br />

Test-scripts zijn programma's dus daar<strong>voor</strong> geldt in principe hetzelfde.<br />

● Status en progressie documenten en build resultaten:<br />

Een belangrijk <strong>voor</strong>beeld zijn files met test resultaten.<br />

Ze slaan op een snapshot, maar niemand wil erop wachten. Voordat ze er zijn, of <strong>voor</strong>dat<br />

ze klaar zijn, is het snapshot reeds historie. Vandaar de eis aan other-focused versions<br />

om zowel een transaction time als een valid time aanduiding te hanteren.<br />

Waarom moet het een repository zwerm zijn?<br />

● Het moet een repository zijn want:<br />

Daardoor is de data beschikbaar <strong>voor</strong> allen.<br />

Door de centrale opslag is er overzichtelijkheid. De status kan worden vastgesteld.<br />

● Het moet een zwerm zijn want er zijn samenwerkende gestructureerde organisaties.<br />

Een organisatorische eenheid moet in staat zijn om zijn deel van de repository toe te<br />

spitsen op zijn behoefte, bij<strong>voor</strong>beeld met behulp van import limitations. Maar het is wel<br />

belangrijk om ook het geheel te zien. Voor dat geheel zijn bij<strong>voor</strong>beeld de importdrawers.<br />

Een organisatorische eenheid –, een party, een afdeling, een persoon –, moet zijn eigen<br />

bestaan en eigenheid beschermen, dus iets aan zelfhandhaving doen.<br />

▪ Daarom is er de behoefte aan privacy, in de vorm van team/transfer drawers <strong>voor</strong><br />

teams, en satellites <strong>voor</strong> personen<br />

▪ Daarom is er behoefte aan een façade, in de vorm van baselines en export-drawers<br />

<strong>voor</strong> teams, export limitations <strong>voor</strong> parties, envelopes <strong>voor</strong> personen.<br />

Met een zwerm is veel en gemakkelijk parallel werken mogelijk.<br />

Waarom moet historie worden opgeslagen, en moeten repositories bewaard worden en toegankelijk<br />

blijven?<br />

● Het parallel werken op de manier van climbexion betekent dat ik vandaag andermans werk<br />

gebruik van gisteren terwijl anderen vandaag mijn werk van gisteren gebruiken. Er is dus<br />

een tijd-venster waarin zowel de versies van gisteren als die van vandaag beschikbaar<br />

Pagina: 213 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.2 Context diagram<br />

moeten zijn. Als je kijkt naar baselines dan moet het venster minstens enkele weken groot<br />

zijn. De opslag in de vorm van historische reeksen (courses), snapshots en dergelijke is het<br />

paradigma waarmee we deze versies ordenen.<br />

● We hebben historie nodig om regressie te lokaliseren, om het project te evalueren, om<br />

werkwijzen te verbeteren, om verantwoording af te leggen. Het tijd-venster wordt nu de<br />

project duur.<br />

● Bij product families, waarbij een nieuw lid ontstaat door veel uit een oud lid opnieuw te<br />

gebruiken, moet je soms ver terug in de tijd om te ontdekken waarom een constructie is<br />

zoals hij is. Het archiveren moet daarom minstens <strong>voor</strong> enkele jaren zijn.<br />

● Soms moeten er ruzies worden beslecht die gaan over project bijdragen, auteurschap,<br />

patenten, kopieerrechten en dergelijke Een repository is dan mogelijk zeer gewenst.<br />

● Een jubilaris of pensionaris wil je graag nog eens confronteren met het werk dat hij gedaan<br />

heeft. Archieven moeten nu al gauw 40 jaar bewaard worden.<br />

● Je hoopt toch altijd dat iemand er nog eens een boek over schrijft, of er een scriptie over<br />

maakt.<br />

Pagina: 214 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.3 Repository Database<br />

3.3 Repository Database<br />

3.3.1 Envelopes<br />

1. Het probleem is <strong>voor</strong> het eerst opgelost in project “Veluwe” maar moet nu ook opgelost<br />

worden in project “Ardennen”.<br />

2. De successor lijst is leeg, want er zijn geen <strong>voor</strong>gangers die een halve oplossing bleken, of<br />

opvolgers, omdat de oplossing in deze envelope incompleet was. Successors verschillen van<br />

comrades, omdat ze nooit collectief worden overgedragen, en per se op hetzelfde work-item<br />

slaan.<br />

3. Toen Lepus het probleem toekende aan Lagus, heeft hij de envelope gecreëerd. Vervolgens<br />

heeft Lagus de wijzigingen aangebracht in zijn satellite, en daarna overgedragen naar de<br />

Transfer-drawer.<br />

4. Dienstdoend integrator Rida heeft een acceptatie test uitgevoerd, en de wijzigingen<br />

overgedragen aan het team-drawer.<br />

Pagina: 215 / 230<br />

Structuur van een envelope


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.3 Repository Database<br />

5. Er zijn 2 files gewijzigd. Van iedere file zijn er 2 versies gewijzigd, maar slechts één<br />

gewijzigde versie is overgedragen (heeft passages ondergaan): Ieder item moet tenminste<br />

één wijziging bevatten waarvan de base in de envelope overeenkomt met de tip in de<br />

ontvangende drawer.<br />

6. De wijzigingen zijn overgenomen uit een neighbor.<br />

7. comrades zijn hier niet ingevuld. Bedoeld zijn envelopes op dezelfde activity en in hetzelfde<br />

team, in een ander package, of op hetzelfde. Bij<strong>voor</strong>beeld: als een nieuwe baseline van een<br />

package van een ander team wordt overgenomen, dan moeten er soms patches en<br />

Pagina: 216 / 230<br />

Voorbeeld van een envelope


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.3 Repository Database<br />

wijzigingen in een aantal packages worden geïmplementeerd, samen met die nieuwe<br />

baseline. De comrade lijst moet (automatisch) hetzelfde zijn in alle comrades. De lijst is<br />

geordend en moet in die volgorde worden overgedragen naar transfer en team-drawer, in één<br />

atomic action. Een weigering van een<br />

item in één van de comrades betekent een<br />

transfer weigering van alle comrades. De<br />

envelope nummering van comrades: Ze<br />

hebben allemaal hetzelfde hoofdnummer,<br />

maar een verschillend volgnummer. Ze<br />

kunnen verwijzen naar verschillende<br />

work-items, maar die moeten tot dezelfde<br />

activity behoren.<br />

8. Er zijn speciale waarden <strong>voor</strong> de<br />

attributes base en labored om aan te<br />

geven dat een course beëindigd wordt of<br />

(weer) begint.<br />

9. Een element dat in een eerdere passage<br />

meedeed, maar nu niet meer, moet toch<br />

worden gebaseerd op de tip in de<br />

ontvangende drawer. maar “labored”<br />

krijgt dezelfde waarde als “base”.<br />

10. Als de lijst met items van een envelope<br />

significant zou wijzigen bij een nieuwe<br />

overgang van satellite naar transferdrawer,<br />

dan kan men beter de envelope<br />

op rejected zetten en een successor<br />

benoemen. Bij<strong>voor</strong>beeld als original en neighbor niet toepasbaar zijn op alle base/labored<br />

alternatives van een item.<br />

Pagina: 217 / 230<br />

Envelope state diagram<br />

State transitions worden gerealiseerd in<br />

passages. De gekleurde pijlen geven passages<br />

weer waarbij daadwerkelijk items worden<br />

overgedragen van de ene drawer naar de<br />

andere.


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.3 Repository Database<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Van alle domains is de organisatie de enige die niet nu ontworpen is. De beschrijving hiervan is<br />

“real world”, al het andere moet ontworpen worden, en is “problem to solve”. De primaire<br />

requirements zijn is in feite:<br />

● de eis dat de SCM machine de juiste informatie krijgt betreffende de access rights van<br />

degene die ingelogd is, of die inlogt,<br />

● de eis dat de SCM machine de volgende informatie kan bemachtigen: welke server wordt<br />

waar<strong>voor</strong> gebruikt, en hoe moet de server worden benaderd.<br />

Afgeleid hiervan is de requirement dat de organisatie, en met name de administrator in staat moet<br />

zijn om deze informatie te verstrekken en actueel te houden, om fouten in deze informatie op te<br />

sporen en te verbeteren, en soms om verantwoording af te leggen <strong>voor</strong> datgene dat geregistreerd is.<br />

De consequenties hiervan <strong>voor</strong> de database en de machine en de administrator moeten in dit<br />

document duidelijk worden.<br />

De te ontwerpen administrator machine wordt in veelvoud geïmplementeerd, Iedere machine heeft<br />

zijn eigen administrator, en zijn eigen database. Er zijn shared phenomena (i) tussen deze machines,<br />

niet alleen omdat ze gemeenschappelijke begrippen hanteren, maar ook omdat zij elkaar raadplegen.<br />

● Het bijhouden van de database door de de administrator: een workpieces concern.<br />

● Het vergaren van informatie uit de database: een transformation concern<br />

● De luxe van een grafische gebruikersinterface: Ambler's major and minor elements and flow<br />

diagrams for user interfaces<br />

● De SCM machine die op verzoek informatie moet ontvangen: information display concern?<br />

● de Administrator machines die informatie moeten ontvangen: information display concern?<br />

● Het starten en stoppen en wijzigen van deze information display concerns: commanded<br />

behavior concern?<br />

Waarom display concerns <strong>voor</strong> de informatie die machines nodig hebben? Kan een machine niet<br />

Pagina: 218 / 230<br />

Problem diagram Administrator


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

elke keer een request sturen als er informatie nodig is? Met het display concern blijft de<br />

mogelijkheid open dat een gewijzigde administrator database een proces interrumpeert, dat anders<br />

zou <strong>voor</strong>tgaan op niet actuele data. Als complicatie betekent dit mijns inziens ook: zorg dragen <strong>voor</strong><br />

acties bij een verbroken contact.<br />

a) Administrator!<br />

• Maintain ids names properties and relationships of parties, teams, projects, persons,<br />

packages, locations<br />

• Asks to show contents of database<br />

• Allows content retrieval to other administrators/administration machines<br />

• Initiate Receive/Request content from other administrators/administration machines<br />

• Login/Logout<br />

Administration Machine!<br />

• Graphical user interface<br />

• Errors & Confirmations<br />

b) Organization!<br />

• Supply information to maintain the database: We want to be registered like this<br />

Administrator!<br />

• Report database status: You are registered like this<br />

c) Organization!<br />

• Its structure must be maintained correctly in order to behave as trusted software<br />

factory<br />

d) Database queries: SQL<br />

e) [c] Organization/Package/Location Model. For access rights in the parties part of the<br />

version <strong>control</strong> system: register the allocation of people to teams and projects, register the<br />

allocation of projects and packages to locations(servers). For locations in other parties<br />

register the administrator database (of another party) that maintains this information, for its<br />

part of the version <strong>control</strong> system.<br />

[f] [g] Interaction to maintain the database, and obtain info from it.<br />

[h] obtaining access rights and location and file info, in order to allow and provide access to<br />

the version <strong>control</strong> system.<br />

f) Administrator! Being a mediator between organization and machine<br />

g) Repository machine!<br />

• Subscribe on access permissions,<br />

• Subscribe on server access data (location info)<br />

Administrator machine!<br />

Pagina: 219 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

• Send access permissions.<br />

• Send Server access data<br />

h) Delayed, until SCM machine is described.<br />

i) Administrator machine!<br />

• Subscribe on project data,<br />

• Subscribe on subproject data.<br />

• Subscribe on package data<br />

• Subscribe on user data<br />

Administrator machine!<br />

• Supply on project data,<br />

• Supply on subproject data.<br />

• Supply on package data<br />

• Supply on user data<br />

De eerste stap van ORM begint met de <strong>voor</strong>beelden. In principe zijn dit “views”. Views horen thuis<br />

in de interface van de administrator machine met de administrator, en in de interface tussen de<br />

administrator machine en de SCM machine en in de interface tussen administrator en organisatie en<br />

in de interface tussen administrator machines. De combinatie van de twee methoden: Problem<br />

frames en Database design hebben een consequentie:<br />

Eerst wordt dat deel van de de interfaces beschreven waarin de primaire informatie behoefte<br />

wordt gedefinieerd: de requests van de SCM machines aan de administrator machine, dan<br />

wordt daarvan afgeleid de informatie die de administrator nodig heeft om de gegevens <strong>voor</strong><br />

deze requests te onderhouden: de secondaire informatie behoefte. Een deel van deze<br />

phenomena heeft de administrator nodig tijdens zijn interacties met de organisatie. Als je<br />

kijkt naar de herkomst van de gegevens, die de administrator nodig heeft, dan blijkt dat een<br />

aantal gegevens in de eigen administrator database onderhouden worden, De administrateur<br />

krijgt deze gegevens eerst van de organisatie, en daarna uit zijn eigen database. Maar andere<br />

gegevens worden gevonden in SCM locations (bij<strong>voor</strong>beeld package pools), of in<br />

administrator databases van andere parties, (bij<strong>voor</strong>beeld masterproject data en data van een<br />

subproject van een andere party). Deze distributie van gegevens bepaalt een aantal interface<br />

phenomena tussen de machines: de tertiaire informatie behoefte. Dan wordt het database<br />

ontwerp gemaakt waarin de de integratie van deze views wordt beschreven. Dit is de<br />

domain description van de database. Tenslotte wordt de interactie die nodig is om de inhoud<br />

van de database te wijzigen afgeleid van het database ontwerp. Dit zijn weer phenomena in<br />

de interface tussen machine en administrator. De indeling in secties in dit document wordt<br />

afgeleid van het problem frame, van de domains en interfaces die daar staan. Deze secties<br />

zijn ontstaan in een stappen volgorde: wil je die volgen dan moet je hoppen van de ene<br />

sectie naar de andere. Ik zal merktekens als primair, secondair, en dergelijke toevoegen<br />

zodat de analyse/ontwerp volgorde van het probleem enigszins is te volgen. De strikte eis<br />

van NIAM en opvolgers om te beginnen met <strong>voor</strong>beelden wordt in tweede instantie<br />

uitgevoerd <strong>voor</strong> alle interfaces beschrijvingen. Eerst wordt de (data-) structuur van de<br />

interfaces uit de doeken gedaan als een soort mindset.<br />

Pagina: 220 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

3.4.1 Interface Administrator machine / SCM machine<br />

We nemen aan dat een beheerder van een SCM Machine deze <strong>voor</strong>ziet van adres en<br />

toegangsgegevens van de Administrator Machine van de organisatie (party) waartoe zij/hij behoort.<br />

Primair<br />

1. SM! Monitor welke rol is weggelegd <strong>voor</strong> uit in <br />

AM! uit in heeft <br />

2. SM! Stop monitoring uit in <br />

User id Party subproject Set of roles<br />

vanOorschotH Schoener Geldrop {Ontwikkelaar,<br />

Build manager}<br />

JansenGMPP Schoener Heeze {Integrator,<br />

Architect}<br />

DijkstraJ Schoener Geldrop {Ontwikkelaar}<br />

deVriesKL Schoener Mierlo {Beperkte Gast}<br />

Bebr2701 Tjalk Geldrop {Volledige Gast}<br />

Kareltje Fregat Leende {} 1<br />

1)Een empty set roles wordt geretourneerd als een gebruiker geen rol heeft, of als een User id, Party<br />

of subproject niet bestaat, of als een User id niet geregistreerd is bij de Party.<br />

3. SM! Monitor het server address van <br />

AM! <br />

4. SM! Stop monitoring <br />

Resource type Naam URL Subscription Return<br />

subproject Veldhoven s1 OK<br />

package-DB Frontend s2 OK<br />

package-FS Anadec s3 OK<br />

subproject Feldhoven s1 error<br />

De namen die gehanteerd worden zijn local names, zoals die in de party van de administrator<br />

database worden gehanteerd. De SCM machines die de gegevens willen hebben zijn eigen servers,<br />

of eigen client machines.<br />

Voorlopig houd ik het hierbij. Het aanmelden, het verzorgen van een secure interface, het zorgen<br />

<strong>voor</strong> een eenmalige aanmelding van een gebruiker, uniform contact maken met elke server – indien<br />

mogelijk – Voorlopig ga ik ervan uit dat een URL volstaat, maar er zijn mogelijk ook nog<br />

protocollaire eisen.<br />

Pagina: 221 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

3.4.2 Interface Administrator / Machine<br />

Secondair<br />

Iedere party heeft zijn eigen administrator(s) en zijn eigen machine en zijn eigen administrator<br />

database. Ik gebruik Jackson schema's <strong>voor</strong> het structuren van de gegevens,<br />

In principe zijn er 4 soorten variables in de records:<br />

• Variables <strong>voor</strong> het herkennen van het soort record. Meestal is dit het “Record type”. Ze zijn<br />

als volgt beschreven: naam = waarde<br />

• Variables die afkomstig zijn uit de eigen administrator database. Deze zijn als volgt<br />

beschreven: naam<br />

• Variables met gegevens die uit andere resources dan de eigen administrator database komen.<br />

Deze zijn als volgt beschreven: naam<br />

• identifiers van objecten uit een mogelijk andere resource: naam<br />

Roles (de rollen die teamleden spelen): dit veld is van het type “set” (verzameling) dit wordt<br />

weergegeven als volgt: {Roles}<br />

Pagina: 222 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Eigen teams<br />

team-id: [recordtype=teamid, id, timestamp created, timestamp ended]<br />

codename: [recordtype=codename, code name, timestamp]<br />

Person-id: [recordtype=person, name, userid, mail address, phone number,<br />

public key]<br />

Personroles: [recordtype=personrole, timestamp, {actual role}, {potential<br />

role}]<br />

package-id: [recordtype=packageid, kin, name, db URL, fs URL]<br />

package-join: [recordtype=packagejoin,eventtype (join team/leave team)<br />

timestamp]<br />

subprojectdata: [recordtype=subproject, local code name, local code name of<br />

master project, sp location URL, timestamp start, timestamp end]<br />

subproject-join: [recordtype=subprojectjoin,eventtype (join team/leave team)<br />

timestamp]<br />

Guest-id: [recordtype=guest, name, userid, {role}, mail address, phone<br />

number]<br />

Guestrole: [recordtype=guestrole, {actual role}, timestamp]<br />

Een potential role definieert wat iemand kan, een actual role definieert wat iemand mag. Personen<br />

en gasten worden alleen vermeld als ze een actual role vervullen of hebben vervuld. Als hun actual<br />

roles een empty set geworden zijn, dan is hun role <strong>voor</strong>lopig uitgespeeld. Role is van het type "Set".<br />

Mogelijk splits ik dit op in een file <strong>voor</strong> "team name", één <strong>voor</strong> "people", één <strong>voor</strong> "packages", en<br />

één <strong>voor</strong> "subprojects"<br />

Pagina: 223 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Personen<br />

Person-id: [recordtype= personid, userid, name, public key, mail address,<br />

telephone]<br />

Potential role: [recordtype= potentialrole, {role}, timestamp]<br />

Team-id: [recordtype= teamid, teamname]<br />

Actual role: [recordtype=actualrole, {role}, timestamp]<br />

Pagina: 224 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Eigen packages<br />

main pools: [Recordtype = locations, kin-pool URL, version-pool URL]<br />

Guid & status: [Recordtype = kin, Timestamp born, kin, Timestamp status<br />

update, Status (born,registered)]<br />

Name: [Recordtype = name, Name]<br />

Event: [Recordtype = event, Type (Allowed, Obsolete), Timestamp]<br />

Team-id: [Recordtype=teamid, name]<br />

Team-join: [Recordtype=teamjoin , Type (join/leave), Timestamp ]<br />

Pagina: 225 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Eigen Master projects<br />

Data: [recordtype=masterproject, Global code name, Local code name]<br />

Person id: [recordtype = personid, Name, userid, mail address, telephone<br />

number]<br />

Roles: [recordtype=roles, timestamp, {roles}]<br />

Subproject data: [recordtype= subproject, Local code name, Local code name<br />

party, admin URL]<br />

package: [recordtype= package, name, kin, Kin pool<br />

Pagina: 226 / 230<br />

URL,<br />

Version<br />

pool<br />

URL]


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Eigen subprojects<br />

Data: [recordtype=data, local code name, Sp URL, timestamp started,<br />

timestamp ended, local code name Master Project]<br />

Team: [recordtype=team, local code name, timestamp] /* course */<br />

package: [recordtype=package, kin]<br />

subprojects zijn overdraagbaar van het ene team naar het andere (niet aanbevolen).<br />

Pagina: 227 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Alle master projects (eigen en participaties)<br />

Master project data: [Recordtype = master project, Local code name, Code<br />

Name, Local party code name, Admin database URL]<br />

Subproject data: [Recordtype= subproject, Local code name, Code name, Local<br />

party code name, Admin database URL /* admin database of party*/]<br />

package: [Recordtype = package, Prefered name, kin, export_drawer URL, Kin<br />

pool URL, Version pool URL]<br />

Member data [Recordtype=team member, User-id, Name {Roles /* in own<br />

subproject */}, mail address]<br />

Roles: [Recordtype = local roles, {Roles /* guest roles in local subprojects<br />

*/} ]<br />

De (non local) Code Names zijn de namen die in het master project gehanteerd worden. De Local<br />

Code Names zijn de namen die binnen de eigen party gebruikt worden.<br />

Pagina: 228 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

3 Methodische probleem beschrijving<br />

3.4 Het administrator subprobleem (zeer <strong>voor</strong>lopig)<br />

Party Lijst<br />

Party data: [Local code name, Own code name, Admin database URL]<br />

Master Project: [Local code Name, Own code name]<br />

Subproject: [Local code Name, code name in master project, local name of<br />

Master project]<br />

Van de eigen party is de lijst compleet, maar van andere parties ziet men alleen de projects waarbij<br />

men betrokken is.<br />

Pagina: 229 / 230


<strong>Climbexion</strong>, <strong>revision</strong> <strong>control</strong> <strong>voor</strong> <strong>softwarewerkplaatsen</strong> datum: 2008-11-05<br />

4 Licentie<br />

4 Licentie<br />

4 Licentie<br />

De tekst is beschikbaar onder de licentie Creative Commons<br />

Pagina: 230 / 230<br />

Naamsvermelding/Gelijk delen.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!