De Bosatlas is nu ook op cd-rom verkrijgbaar. Mooie landkaarten en een schat aan informatie. Interactief. Zoals het tegenwoordig in deze moderne tijd hoort. Maar hoe bouw je zo’n cd-rom? Dat is helemaal nog niet zo gemakkelijk, hoorde Robbert Hoeffnagel van de projectleider.
De onlangs verschenen 52e editie van de Grote Bosatlas gaat vergezeld van een cd-rom met extra informatie die ontsloten kan worden via een digitale kaart. Opmerkelijk aan dit project is het feit dat de omgeving geheel in Java is gecreëerd. Daarmee is de Bosatlas nu in belangrijke mate klaar voor ontsluiting via internet. Maar de ontwikkelaars stonden wel voor flinke uitdagingen om tot een acceptabele performance te komen op relatief lichte pc’s. Dankzij een ‘just in time’ compiler, het gebruik van een ‘profiler’ om trage algoritmes en geheugenproblemen op te sporen, en de inspanningen van een Chinese programmeur die een Jdbc-driver voor dBase wist te ontwikkelen, kan de gebruiker van de Bosatlas nu talloze demografische gegevens op interactieve wijze met elkaar te combineren.
Ooit was de Bosatlas een traditionele verzameling van kaarten. In de loop der jaren zijn hier steeds meer economische, geografische, politieke en demografische gegevens aan toegevoegd. Dat gebeurde echter altijd in de vorm van tweedimensionale kaarten waarin ontwikkelingen aan de hand van kleuren, diagrammen of pijlen werden geïllustreerd. Sinds enige tijd is de Bosatlas ook een interactief medium. Uitgever Wolters Noordhoff spreekt zelfs van een geografisch informatiesysteem. Naast de traditionele kaarten is aan het product namelijk een cd-rom toegevoegd waarop een schat aan informatie bijeen is gebracht.
Wie een demonstratie van deze cd ziet, zal niet direct in de gaten hebben dat alle bewerkingen en presentaties op basis van in Java geschreven programmatuur tot stand komen. De keuze voor Java is gezien de reputatie van deze omgeving – te weten: traag – opmerkelijk te noemen. Rudie Missoorten, vestigingsmanager Amsterdam, bij het in Assen en de hoofdstad gevestigde softwarebureau Wisdom en projectleider van de cd-rom, is het daar geheel mee eens.
Toch waren er goede redenen om voor Java te kiezen, meent hij. Zo was er een strategisch argument. "De uitgever wilde de Bosatlas geschikt maken voor ontsluiting via internet", vertelt Missoorten. "Het idee was dan ook dat de interactieve variant geheel in een browser zou moeten kunnen functioneren en dan is Java een voor de hand liggende keuze."
Gericht op onderwijs
De applicatie waarmee op basis van een digitale kaart een schat aan demografische en andere gegevens ontsloten kan worden, is vooral gericht op het onderwijs. Dat betekent dat goed gekeken moest worden naar de vaak sterk in kwaliteit wisselende technische infrastructuren waarmee de doelgroep werkt. Op basis van onderzoek van Wolters Noordhoff werd uiteindelijk besloten de systeemeisen niet te hoog op te schroeven. De applicatie moest goed kunnen draaien op een pc met minimaal Windows 95, een Pentium 100-processor en 32 mb aan werkgeheugen.
Bovendien diende zowel standalone- als netwerkgebruik te worden ondersteund. Ook dat creëerde een aantal randvoorwaarden waarmee rekening gehouden moest worden. Bij een standalone-situatie kan de gebruiker kiezen uit twee installatiemethoden. De eerste is een volledige installatie waarbij applicatie en alle data op de harde schijf van de pc worden geplaatst. Tegelijkertijd beschikken steeds meer onderwijsinstellingen over netwerken. Dat betekent dat de Bosatlas ook in een dergelijke omgeving geïnstalleerd moet kunnen. De logica komt dan op de decentrale pc te staan, de data wordt van de server gehaald.
Een vergelijkbare oplossing voorziet de uitgever voor het gebruik van internet. De programmatuur dient gereed te zijn om op internet naar geografische data te kunnen zoeken, deze over te halen naar de locale omgeving, om deze vervolgens te gebruiken in analyses en bewerkingen.
Daarnaast had de uitgever besloten om alles – applicatie en geografische data – op slechts één cd-rom te plaatsen. Dat leverde beperkingen op ten aanzien van de hoeveelheid mee te leveren gegevens. Het geheel diende immers binnen 700 mb te blijven.
Om al dit soort omgevingen te kunnen ondersteunen is het erg handig om in de applicatie een duidelijke scheiding aan te brengen tussen de presentatielaag, de ‘business logica’ en de eigenlijke data.
Zoals gezegd is vrijwel de gehele applicatie geschreven in Java. Alleen bij een aantal meegeleverde spelletjes en een speciaal softwareprogramma rond ‘remote sensing’ speelt Java geen rol. "Deze software is door andere partijen ontwikkeld", vertelt Missoorten. "Zo is de remote sensing applicatie afkomstig van Tensing SKS in Zaltbommel. Wij hadden graag in ieder geval de spelletjes herschreven in Java, zodat alles op de cd een zelfde structuur en uitstraling zou hebben, maar dat is als gevolg van tijdsgebrek niet gelukt. Deze separate programma’s zijn nu simpelweg in de gebruikersinterface ‘gehangen’, maar volgen verder niet de structuur en de vormgeving van de rest van de Bosatlas."
Al snel bleek dat het gebruik van een browser ongunstig uitpakte. "Gezien de systeemeisen – 32 mb intern geheugen – is het nauwelijks mogelijk om én Windows én een Java Virtual Machine én een browser te draaien en dan ook nog redelijke responsetijden te halen. Alleen al een virtual machine heeft 10 tot 20 mb aan werkgeheugen nodig. Het gebruik van een browser is dus vooralsnog niet mogelijk. Kijk je echter naar de ontwikkelingen op de markt, dan zou het me niet verbazen als over enkele jaren bij de volgende editie het wél mogelijk is omdat de gemiddelde pc dan over veel meer werkgeheugen zal beschikken dan nu het geval is."
Argumenten
Java werd voorheen voornamelijk gebruikt voor het toevoegen van dynamische content aan webpagina’s met behulp van applets (kleine applicaties) en tegenwoordig ook wel servlets ofwel Java-processen die op een webserver draaien. In de visie van Wisdom is Java inmiddels uitgegroeid tot een volwaardig platform dat geschikt is voor het ontwikkelen en draaien van vrijwel ieder denkbaar type software. "We hadden natuurlijk ook met Visual Basic of Delphi aan de slag kunnen gaan, maar dat hebben we toch niet gedaan, hoewel ons dat technisch gezien misschien toch wel minder problemen had opgeleverd." Vijf argumenten onderbouwen voor Missoorten echter de keuze voor Java.
De eerste is het feit dat Java in principe onafhankelijk is van het onderliggende platform. "Een Java-applicatie kan ontwikkeld worden voor ieder platform waarvoor een Java Virtual Machine (Jvm) beschikbaar is. Inmiddels is dat voor vrijwel ieder gangbaar platform het geval. Dat betekent dat de ontwikkelkosten redelijk binnen de perken gehouden kunnen worden, doordat niet zozeer voor ieder gewenst platform een nieuwe variant gebouwd behoeft te worden, maar slechts één core-applicatie voldoende is die vervolgens via de virtual machine op de gewenste platformen wordt geïmplementeerd."
Al tijdens het ontwikkelen van de digitale atlas bleek dat er op dit punt ook voor Wisdom zelf voordeel te behalen was. Een deel van de ontwikkelaars maakte gebruik van de Java Software Development Kit onder Windows NT, terwijl anderen een voorkeur hadden voor het gebruik van Linux. "De code die beide groepen schreven bleek probleemloos met elkaar te integreren."
Java is in de ogen van Missoorten bovendien een toekomstgerichte omgeving. Opmerkelijk genoeg is hij die mening niet toegedaan waar het om Visual Basic of Delphi gaat. "Wolters Noordhoff wil ook bij volgende edities van de atlas een cd kunnen meeleveren. Dat wil dus zeggen dat de ontwikkelomgeving toekomstvast moet zijn. Visual Basic en Delphi vallen dan toch een beetje af. Die omgevingen worden ontwikkeld door één bedrijf. Bij Java gaat het om een veel bredere ontwikkeling. Er zijn zeer veel ontwikkelaars mee bezig bij tal van ondernemingen en universiteiten, de acceptatie groeit nog altijd en grote IT-bedrijven als IBM, Oracle en Sun hebben zich zeer nadrukkelijk achter Java geschaard."
Daarnaast kent Java standaard bibliotheken met functies voor bijvoorbeeld het ondersteunen van netwerkcommunicatie. Denk aan socket-communicatie of een faciliteit als Remote Method Invocation (rmi) waarmee objecten op andere Java Virtual Machines kunnen worden aangeroepen. "Visual Basic noch Delphi kennen standaard dat soort faciliteiten. In het geval van Java gaat het bovendien ook nog eens om libraries die veel gebruikt worden en die daardoor dus goed uitgetest zijn. Het betekent dat je niet iedere keer opnieuw het wiel hoeft uit te vinden, maar simpelweg voor veel functionaliteit een beroep op functiebibliotheken kunt doen."
"Daar komt nog bij dat Java een dynamische omgeving is. Dat wil zeggen dat het zonder meer mogelijk is om een module bij te laden, zonder dat de bestaande modules eerst aangepast dienen te worden of opnieuw gecompileerd moeten worden. Sterker nog, de eindgebruiker merkt veelal helemaal niet dat een module toegevoegd is."
Een laatste argument dat volgens Wisdom vóór het gebruik van Java spreekt is het feit dat de gebruikersinterface die standaard wordt meegeleverd functionaliteit biedt waarmee applicaties ook voor gehandicapten geschikt gemaakt kunnen worden. Zo is het mogelijk kleurinstellingen aan te passen zodat slechtzienden beter met een applicatie uit de voeten kunnen, terwijl ook het gebruik van auditieve signalen mogelijk is.
Hulpmiddelen
Tegenover dit soort pluspunten staat echter ook één belangrijke minpunt: het gebrek aan snelheid, zeker wanneer een Java-applicatie wordt vergeleken met een toepassing die is vervaardigd met C++ of Delphi. Dat komt omdat de meeste Java Virtual Machines interpreters zijn. Dat wil zeggen dat zij de zogeheten Java-bytecode lezen en vervolgens op basis daarvan beslissen welke functies moeten worden uitgevoerd.
Wanneer dat vergeleken wordt met een gecompileerd programma, is duidelijk dat interpreteren relatief veel extra tijd kan kosten. Gaat het om een gecompileerd programma, dan is de broncode reeds vooraf omgezet in binaire code en kan deze dus direct door de processor van het systeem worden verwerkt. In het geval van een interpreter moet eerst gewacht worden op het inlezen van de bytecode en de daaropvolgende beslissing welke functie moet worden uitgevoerd, terwijl pas daarna de cpu aan de slag kan gaan.
Dit aspect speelt nog extra in het nadeel van Java wanneer de gehanteerde systeemeisen aan de lage kant zijn, zoals bij de Bosatlas het geval is. Missoorten: "We moesten dus op zoek naar mogelijkheden om de prestaties op een acceptabel niveau te brengen. Ik schat dat we zeker tien procent van alle inspanningen die in het project zijn gaan zitten voor deze optimalisatie hebben ingezet."
Een eerste hulpmiddel dat is toegepast, is de Jprobe-software van Sitraka Software. JProbe – inmiddels toe aan versie 3 – bestaat uit een reeks van hulpmiddelen voor ‘performance tuning’. Er is onder andere een Jprobe Profiler met een geïntegreerde ‘memory debugger’ beschikbaar. Deze kan gebruikt worden om voorspellingen te maken van de performance op basis van de tot dan toe beschikbare Java-code. De memory debugger helpt bovendien om het gebruik van het geheugen te optimaliseren.
De Jprobe Threadalyzer helpt om de diverse ’threads’ in een ‘multithreaded’ applicatie te synchroniseren en er voor te zorgen dat alle threads op de juiste manier samenwerken om de gewenste taak uit te voeren. Met Jprobe Coverage is een soort beheeromgeving voor het testen van code beschikbaar. Het maakt het onder andere mogelijk te ontdekken of alle Java-code getest is en identificeert eventuele nog niet geteste code.
"Jprobe kijkt onder andere naar het gebruik van resources", vertelt Missoorten. "Interessant aan dit product is dat het niet alleen aangeeft waar zich ‘bottlenecks’ voordoen, maar dat het bovendien hulpmiddelen biedt om te ontdekken waardoor die problemen worden veroorzaakt."
Het is echter geen goedkoop pakket, vertelt Missoorten: "De kosten liggen op ongeveer tweeduizend dollar per ontwikkelaar. Het doet echter dermate goed zijn werk, dat we binnen Wisdom Jprobe nu als een standaard faciliteit bij Java-projecten gebruiken."
Het is bovendien een product dat zich goed laat toepassen in ontwikkelomgevingen waar weliswaar kennis van Java aanwezig is, maar nog niet erg veel ervaring is opgebouwd. "Veel problemen worden veroorzaakt door onvoldoende praktijkkennis. Vergelijk het met een Oracle-omgeving: een query waarin ‘minus’ wordt toegepast, kan wel 300 tot 400 procent sneller uitpakken dan wanneer ‘not in’ wordt gebruikt. Dat haal je veelal niet uit een handboek en bij menige cursus wordt het je niet verteld. Zoiets weten, is een kwestie van praktijkervaring – zo ook bij Java."
JIT-compiler
Het tweede hulpmiddel dat is gebruikt om de prestaties op een goed niveau te krijgen, is de Just in Time (jit) compiler van Sun. Standaard wordt de Java-code door de Java-compiler gelezen en omgezet in bytecode. Deze bytecode wordt daarna in een class-file geplaatst. Dit bestand kan vervolgens op iedere machine waarop een Java Virtual Machine aanwezig is worden geïnterpreteerd. Met andere woorden: de bytecode wordt gelezen en uitgevoerd.
Wanneer op een systeem een Jit-compiler aanwezig is, functioneert de Java Virtual Machine echter anders. Wanneer de class-file is gelezen, wordt deze doorgegeven aan de Jit-compiler. Deze compileert de bytecode naar de native code van het systeem waarop de Java Virtual Machine draait. In de regel levert dit een aanzienlijk snelheidsvoordeel op.
Hoewel een Jit-compiler in principe deel uitmaakt van iedere Java Virtual Machine, is het in een aantal omgevingen mogelijk om het gebruik er van ‘aan’ of ‘uit’ te zetten. Het is namelijk niet zo dat het gebruik van Jit-code per definitie tot snelheidsvoordeel leidt. Het kan ook zo zijn dat de structuur van de code dusdanig is dat de tijd die nodig is voor het interpreteren van de bytecode korter is dan de periode die gemoeid is met het compileren van diezelfde bytecode. In het geval van de Bosatlas is ervoor gekozen wél met Jit-code te werken, aangezien er in dit geval wel degelijk sprake is van interessante snelheidsvoordelen in het verwerken van code. Missoorten spreekt van een verbetering die varieert van 50 tot 100 procent.
Framework
Met deze twee hulpmiddelen slaagde Wisdom er in de performance op een niveau te krijgen dat aan de eisen van de uitgever voldeed. Een ander belangrijk aspect van het project was structuur te brengen in de applicatie. "We hebben een speciaal framework ontwikkeld dat als een overkoepelende module de toegang regelt tot de database, de diverse Gui-elementen en bijvoorbeeld het hoofdmenu. Bovendien regelt het framework de communicatie tussen de diverse modules."
De rol van het framework blijkt wellicht het beste uit een voorbeeld. Wanneer een gebruiker in de zoekmodule bijvoorbeeld de term ‘Nederland’ ingeeft, krijgt deze hierop een lijst met resultaten gepresenteerd. Hierna kan hij verder zoeken aan de hand van dit overzicht. Bijvoorbeeld door uit de lijst met zoekresultaten ‘Nederland, bevolkingsdichtheid’ te kiezen. Dat betekent dat de statistiekmodule geactiveerd moet worden en statistische gegevens zichtbaar gemaakt dienen te worden. Dit gebeurt door de zoekmodule een ‘event’ naar het framework te laten sturen waarin aangegeven is welke module gestart moet worden en welke zoekterm is geselecteerd. Het framework neemt hierop de gewenste actie.
Voor deze aanpak is gekozen om een strakke en overzichtelijke structuur te kunnen handhaven, ook wanneer gebruikers steeds dieper in het programma gegevens combineren. Dat was onder andere nodig aangezien de uitgever van de atlas duidelijke ideeën heeft over de structuur en de vormgeving van de interface. "Wij zijn gewend om bij Java-projecten gebruik te maken van de Swing library. Daarin zitten talloze standaard interface-elementen die je snel en efficiënt in een Gui kunt opnemen. In dit geval ging dat anders, omdat de uitgever eigen vormgevers aan de slag had gezet die met interface-elementen terugkwamen die niet standaard beschikbaar zijn. Die hebben we dus veelal zelf moeten maken en aanpassen. Soms lukte dat op basis van Swing-elementen, in andere gevallen moesten we zelf iets bedenken."
Jdbc-driver
De gegevens die met de applicatie kunnen worden ontsloten, zijn afkomstig uit tal van bronnen. De digitale kaarten zijn bijvoorbeeld ontwikkeld door een samenwerkingsverband van Wolters Kluwer, het Amerikaanse concern Rand-McNally en het Italiaanse De Agostini.
Andere data is aangeleverd door instellingen als het CBS. "Al die data hebben we met zelf ontwikkelde conversie-tools omgezet, waarbij met name de keuze van het uiteindelijke formaat de nodige discussie heeft opgeleverd. We konden gezien de ruimtebeperkingen moeilijk op de cd een ‘runtime’ versie van Oracle of My SQL meeleveren. Dus zijn we op zoek gegaan naar een plat en breed ondersteund formaat. We hebben ook even naar xml gekeken, maar dat bleek te traag en de benodigde parser was te omvangrijk. Ook ontbrak een geschikte Java Database Connectivity (Jdbc) driver om vanuit Java toegang te kunnen krijgen tot de onderliggende database."
Uiteindelijk kwam Wisdom uit op ‘good old’ dBase. "Dit is een eenvoudig formaat, waarbij voor iedere databasetabel een bestand met een extensie dbf bestaat. Het voordeel hiervan is dat individuele tabellen gemakkelijk kunnen worden vervangen of toegevoegd. In Microsoft Access is dat bijvoorbeeld veel lastiger te regelen."
De keuze van het databaseformaat maakt op applicatieniveau niet zo vreselijk veel uit. Hier wordt gewerkt met generieke sql-queries die vervolgens naar een Jdbc-driver worden gestuurd. Dat bleek echter toch een probleem op te leveren: er was geen geschikte Jdbc-driver voor dBase voorhanden. "Tijdens onze zoektocht op internet naar een geschikte driver kwamen we onder andere in een aantal nieuwsgroepen terecht. Daar meldde zich een programmeur uit China die de nodige ervaring op dit gebied bleek te hebben. Deze Chinees heeft ons uiteindelijk op het goede spoor weten te zetten en ik moet zeggen: het werkt prima. Hij vroeg – meen ik – tweehonderd dollar voor deze klus."
Toen eenmaal de juiste Jdbc-driver voorhanden was, werd het mogelijk sql-queries om te zetten in opdrachten waarmee een dBase-driver uit de voeten kan. Deze kan hierop de gewenste dbf-bestanden laden. "Het voordeel van Jdbc als laag tussen de database en de applicatie is natuurlijk dat als we ooit mochten overstappen op een andere database, alleen de driver vervangen hoeft te worden en de applicatie intact kan blijven."
Waterval of iteratief?
Missoorten noemt het ontwikkelen van de digitale Bosatlas een ‘r&d-achtig project’. "We wisten van tevoren dat we met veel nieuwe aspecten te maken zouden krijgen, aangezien een Java-project van deze omvang voor zowel de opdrachtgever als voor ons nieuw was. Dat maakt het moeilijk om vooraf duidelijke stappen in het project te definiëren. Ik was daarom voorstander van een aanpak op basis van de Dynamic System Development Method (Dsdm), waarbij een iteratief ontwikkelmodel wordt gevolgd. De opdrachtgever bleek echter toch een voorkeur voor de watervalmethode te hebben."
Uiteindelijk is men toch enigszins in het midden uitgekomen. "We zijn gaan werken met een aanpak waarbij we ‘weekly builds’ hebben opgeleverd. Daardoor kon de uitgever iedere week zien hoe het project er voor stond en of alles zich nog in de juiste richting ontwikkelde. Dat is dus toch wel enigszins iteratief te noemen. Wat uit de watervalmethode is overgebleven, is het feit dat gewerkt is met vooraf afgesproken set van functie-eisen en een vast budget."
Robbert Hoeffnagel Freelance Medewerker