Climbexion revision control voor softwarewerkplaatsen Henk ...
Climbexion revision control voor softwarewerkplaatsen Henk ...
Climbexion revision control voor softwarewerkplaatsen Henk ...
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.