Mortens liv med for-løkker [Luke 2, 2012]


søndag 2. desember 2012 Julekalender Meninger

Morten Dæhlen er leder for Institutt for Informatikk ved Universitetet i Oslo. Jeg har hatt et halvt øye til bloggen hans i flere år, og Morten virker å være en fremoverlent instituttleder med mange meninger. Jeg er glad han sa seg villig til å bidra til årets julekalender.

Morten Dæhlen

Hvem er du?
Matematikkinteressert bondesønn fra Vardal (ved Gjøvik) som havnet i informatikkens verden.

Hva kan du?
Mye om hva som foregår innen informatikkfaget og ledelse av forskere, og i gamle dager kunne jeg programmere (Var særlig god på for-løkker!)

Hva liker du best med yrket ditt?
At jeg får lov til å være leder for mange flinke mennesker og at jeg hvert eneste år møter unge, dyktige og forventningsfulle studenter.

Og her følger Mortens bidrag...

Programmering og mitt liv med for-løkker

Årets julekalender her på programmeringsbloggen til Torbjørn er dedikert til gjester, som i all hovedsak er programvareutviklere. Det er mange år siden jeg programmerte, så det er med en viss ydmykhet jeg har tatt på meg oppgaven å komme med et bidrag.

Som leder av Institutt for informatikk ved Universitetet i Oslo jeg selvfølgelig opptatt av programmering, og kanskje først og fremst utdanning av gode programvareutviklere. Institutt for informatikk driver også forskning på området, f.eks. hvordan skal fremtidens programmeringsomgivelse være, hva vil fremtidens programmeringsspråk inneholde, hvordan sikre høy programvarekvalitet i distribuert systemer, parallell programmering for store beregninger og flerkjerne prosessorer, og metoder for program- og systemutvikling.

Programmering – kjernen i informatikk
Informatikk er lærer om hvordan datasystemer konstrueres og brukes. Datasystemer  består av en eller flere datamaskiner (maskinvare), nettverk bestående av kommunikasjonslinjer mellom datamaskiner, ulike former programvare som utfører definerte oppgaver, forskjellige målesystemer (sensorer) som fanger data, innretninger som utfører oppgaver (aktuatorer), grensesnitt og/eller relasjonen til den eller de som bruker systemet, samt ulike former for medier der data kan oppbevares. Datasystemer formes i all hovedsak av programvare utviklet i et passende programmeringsspråk. Programvare betraktes derfor som kjernen i et datasystem, og utvikling av programmeringskompetanse står sentralt i enhver informatikkutdanning.

Hvordan lærer studentene programmering?
Grunnfilosofien i utdanningen av programmerere/utviklere ved Institutt for informatikk er ”learning by doing”. Studentene starter med å bygge enkle små programmer for deretter å utvide programmene med ny funksjonalitet for å løse større og større oppgaver. Brorparten av studentene får denne innføringen gjennom programmeringsspråket Java. For de som velger en mer matematisk eller naturvitenskapelig retning bruker vi Pyhton.

Deretter går studentene over i en fase der de lærer ulike aspekter ved systemutvikling, som naturlig inkluderer en mer overordnet tilnærming til det å løse et gitt problem. Innenfor denne helheten tilbys ulike kurs der studentene får innføring i spesielle teknikker og metoder knyttet til de ulike studieprogrammene på instituttet. Programmeringsspråkene som brukes, i tillegg til Java og Pyhton, er C, SQL, Intel x86 (Assember), PROLOG og ML.

Etter tre år er studentene klare for et arbeidsmarked der etterspørselen etter utviklere har vært og er meget stor. Mange (de fleste) velger imidlertid å gå videre med en masteroppgave innenfor forskningsfeltene til en av instituttets 13 forskningsgrupper.

Mitt liv med for-løkker
Jeg startet min karriere som programmerer i 1980 gjennom å lære Simula og objekt-orientert programmering. (Min aller første blogg-artikkelDærnt´s Corner handlet om oppfinnelsen av objekt-orientert programmering og Simula på 1960-tallet.) Som numeriker og interessert i beregninger måtte jeg imidlertid ganske tidlig forholde meg til FORTRAN, men det ble raskt programmering i C og litt i C++ før min utviklerkarriere fordampet midt på 1990-tallet.

Min forkjærlighet for løkker, og særlig for-løkker handlet selvfølgelig om at jeg drev med beregninger der jeg bl.a. arbeidet med å finne strukturer i, på den tiden, relativt store mengder ustrukturerte data.

La oss anta at de ustrukturerte data var punktmålinger som beskriver en eller annen flate i rommet, se figuren som viser en spesiell terrengmodell på kanten av et gammelt krater fylt med vann. Disse flatene kunne være alt fra terrengmodeller og geologiske strukturer til overflater på indre organer i kroppen. Spørsmålet var hvor mange punkter trengte jeg og hvor måtte disse punktene ligge for at jeg ved hjelp av en passende matematisk representasjon skulle kunne beskrive denne flaten med en gitt nøyaktighet i forhold til målingene.

Screen-shot-2012-11-28-at-3.01.52-PM

Bildet viser de originale terrengdata (venstre), en tilnærming som bruker ca. 4% av datapunktene (midten), og en tilnærming til originalen som bruker ca. 0.7% av de opprinnelige datapunktene (høyre). Bildene er generert på 1990-tallet.

Her er det selvfølgelig minst én løkke for å løpe gjennom alle datapunktene, men det er på langt nær nok. Et spørsmål var å finne ut hvor mange ganger måtte jeg gå gjennom alle punktene for å finne de signifikante punktene og for hver gang bestemme meg for hva var kjennetegnet til et signifikant punkt og til syvende og sist å velge disse punktene.  Det finnes mange måter å gjøre dette på, noen mer sofistikerte enn andre og mange av disse er det tilnærmet umulig å forklare i prosa (krever matematisk notasjon), så jeg velger her å forklare en litt forenklet tilnærming:

  1. Vi starter med en gjennomgang av punktene der jeg mer eller mindre tilfeldig velger en liten delmengde av punktene.
  2. Jeg lager så en flate ved hjelp av de valgte punktene og en passende matematisk funksjon som beskriver en flate.
  3. Jeg måler feilen mellom flaten og punktene.
  4. Jeg plukker så ut nye punkter der feilen er stor (og i noen tilfeller forkaster jeg også punkter som er valgt tidligere da disse ikke viser seg å være signifikante)
  5. Dersom feilen er liten nok (og i noen tilfeller også oppfyller andre kriterier, for eksempel et passende kriterium for glatthet) er jobben gjort og jeg er ferdig, hvis ikke starter jeg på nytt med punkt 2.

Her er valgmulighetene mange, både i forhold til valg av punkter, hvilke matematisk funksjon jeg vil bruke for å representere flaten og hvordan denne funksjonen plasseres i rommet. (Det som brukes mest er varianter av minste kvadraters metode.) Jeg skal ikke gå videre inn på dette, men jeg håper leseren kan leve seg inn i at disse metodene krever mye tenkning i forhold til hvordan løkker skal konstrueres slik at beregningene blir mest mulig effektiv.

GOD JUL!


comments powered by Disqus