RSS:
Publications
Comments

Hvordan vi bygde en facebook chat-applikasjon på NRKbeta i løpet av bare en måned

NRK har fått med seg at kidsa sitter med laptopen på fanget når de ser på tv, og at de twitrer og chatter om det de ser. De ønsker naturlig nok å trekke kidsa nærmere seg ved å være tilstede der kidsa (også) er — på nettet.

Prosjekleder Andreas Wiik på “NRK Nye Medier” hadde fått oppgaven: På en liten måned skulle han ha en fullt brukbar chatte-tjeneste på nett, med innebygd markedsføring. NRK ønsker altså å bygge et stykke software der kidsa — og eventuelle andre som føler seg kallet til en intim chattestund fokusert på en enkelt tv-sending — naturlig vil samles for å kommentere det stygge håret til tv-verten, eller oppfordre andre til å stemme på sin favoritt, eller hva-enn-kidsa-bestemmer-seg-for-å-gjøre med en fokusert chatte-tjeneste.

Hvordan lager du en fungerende Facebook chatte-applikasjon på 20 arbeidsager? Desember 2009?

Som en første iterasjon av et større prosjekt, ville prosjektleder Andreas Wiik  kjapt bygge en tjeneste som kapitaliserte på en eksisterende brukergruppe  så den kunne “go viral” — altså spres ved at folk forteller hverandre om den. Han ville lage en TV-prat applikasjon som kunne spres virtuelt via folks vennelister. Andreas samler tre konsulenter fra tre forskjellige selskaper, får opp en utviklingsserver og alt som hører til, og kjører en slags mini-scrum med ukeslange sprinter. Og lykkes. Ved første Melodi Grand Prix delfinale legges linken til facebook-applikasjonen ut på NRKbeta, og 250 brukere signer opp og begynner å chatte.

Bevisst bruk av åpne løsninger

En slik kjapp utvikling hadde ikke vært mulig uten et bevisst fokus på å bruke eksisterende, åpne løsninger. Istedenfor å utvikle kruttet på nytt, legges all tid og energi inn på å skape bare akkurat det som er nytt ved den nye softwaren. En Openfire chat-sever ble brukt som underliggende chatte-teknologi. Denne implementerer den åpne XMPP-standarden (også kjent under det mer sexy navnet Jabber). XMPP er en xml-standard for både gruppe- og direktemeldinger, og for såkalte “presence”-meldinger; slike som forteller vennene dine at du er “online” eller “idle” eller “out fishing”. For å bygge opp slike xml-strenger som følger XMPP-standarden, slik at vi kunne sende dem fra brukernes nettlesere til Openfire-serveren, benyttet vi Jack Moffitt’s Strophe-bibliotek. Dette er et deilig javascript-bibliotek som brukes til å bygge XMPP-xml, og som i tillegg tar seg av å sette opp en BOSH-forbindelse til serveren,og gir oss hendelser fra serveren på et gullfat. Strophe kan derimot ikke brukes til å tolke xml’en som kommer fra Openfire-serveren. Men til det passet jQuery som hånd-i-hanske.

Masters of Glue

Når teknologiene allerede er laget, hva gjør programmereren i prosjektet? På mange måter kan vi si at programmererens oppgave blir å lime eksisterende teknologier sammen; han lager litt logikk for å lime sammen brukerhåndteringen til Facebook og OpenFire, litt logikk for å bestemme hvordan OpenFire-chattemeldinger skal vises i browseren, litt logikk som bestemmer hvordan brukeren skal kunne interagere med den nye applikasjonen. Det kan kanskje høres ut som om programmererens rolle nedtones. Det kan være fristende å sette inn nyutdannede, rimeligere “ressurser” i et slikt arbeid. I praksis bør du tenke deg om en gang til før du iverksetter en slik taktikk. Hvorfor? Fordi det å raskt sette seg inn i forskjellige APIer er det samme som å raskt sette seg inn i andre programmereres tankesett. Og det krever erfaring.

Eksisterende teknologier + Erfarne programmerere = Rask utvikling av nye produkter

Hvordan er det mulig å lage en fullt fungerende, testklar viral chatte-applikasjon på en måned? Svar: ved å “leverage” eksisterende teknologier, og få erfarne programmerere til å sette dem sammen, samt lage de manglende bitene. På 20 dager har vi ikke laget et perfekt produkt, det er fremdeles noen feil og mangler. Men på kun en liten måned har vi laget et produkt som kan vises frem og brukes. De første brukerne vil kunne komme med tilbakemeldinger og dermed være med på å forme det videre produktet slik at det blir noe de kunne tenke seg å bruke på lengre sikt. På den måten kan du sikre at du ikke bruker lang tid og mye penger på å utvikle et produkt det til slutt viser seg at ingen vil ha.


Ingen vil ha Google Wave

Det er merkelig. For ikke lenge siden ble vi svette i hendene bare av å høre om Google Wave. Hvem har invites? Det oppsto scams på twitter, og folk solgte dem på ebay. Så, plutselig, er det ingen som vil ha det.

For to uker siden sendte jeg ut en tweet fra @programmerer om at jeg hadde 23 wave invites jeg skulle gi bort. Alt man trengte gjøre for å få en, var å sende meg en dm.

Så langt: ingen svar.

Under lunsjen på nrk idag ble jeg sittende og prate med en av flash-utviklerne på nrk beta, som også hadde et utall ubrukte invites.

Hva skjedde?

På den interne mailinglista hos oss på Net Professionals (sidespor: vi bytter navn i begynnelsen av 2010… følg med ;) ) — har Wave fått mye pes. Hva skal det brukes til?

Det kan jeg endelig røpe.

Her om dagen fikk jeg nemlig for første gang virkelig nytte av Wave. En av de andre konsulentene på prosjektet vårt på nrk satt i Stockholm og jobbet, og vi skulle utarbeide en plan for refaktorering av litt javascript.

Vi brukte Wave, og ikke noe annet verktøy jeg kjenner kunne vært mer effektivt:

1) Vi kunne chatte i hver vår “wavelet”, og se hva den andre skrev mens vi selv skrev — noe som eliminerte masse bortkastet tid.

2) Vi kunne samarbeide i en annen wavelet om selve “spekken” på omstruktureringen — og hadde forskjellige wavelets for hver bit av systemet som skulle omstruktureres. (Samtidig som vi så de pågående chattene.)

3) Vi kunne rydde opp i det som allerede var skrevet — underveis, mens vi jobbet — som et resultatet av den løpende konversasjonen, og sto dermed igjen med et ferdig dokument for hva som skulle gjøres, ved samtalens slutt.

Google Wave er en underlig hybrid av instant messaging og email (++), og jeg forsto ikke helt nytten før den plutselig dukket opp av seg selv, og jeg kommer definitivt til å fortsette å bruke disse bølgene, for å se om de plutselig skaper den perfekte stormen igjen.

P.S. Hvis du nå har lyst å leke med med Google Wave og trenger en invite, kan du fremdeles få en — som julegave fra meg.


Twitter kan hjelpe deg finne programmeringsoppdrag

Du har kanskje tenkt på at du kan promotere deg som programmerer og konsulent ved å blogge og tweete om relevante, nyttige informasjonsbiter. Men søker du gjennom den store strømmen av sanntidsinformasjon for å se om noen leter etter deg (eller noen som deg) — akkurat nå?

I et distré øyeblikk satt jeg og kikket gjennom http://collecta.com/#q=programmerer, et realtime-søk i sosiale medier, på termen “programmerer”. I lista idag var det en som søkte etter en PLS-programmerer, og  en som ønsket seg programmerer/systemutviklere. Han som var på jakt etter en PLS-programmerer, ba folk om å RT, altså å re-tweete.

Hva betyr det i praksis? Jo det betyr at han ber folk som følger ham på twitter, om å sende den samme tweeten, så folk som følger dem på twitter, også kan få vite at han er på jakt etter en slik programmerer. Så langt var det en re-tweet. Gjett hva han gjorde? Jo han ba også folk om å re-tweete. Hvis hans følgere også tar oppfordringen, vil den origianale twitter-brukeren snart nå ut til noen som kan det han er på jakt etter.

Men: sjekker du jevnlig, så kan du nå din neste oppdragsgiver først, før han finner noen andre.

Det er jo verdt en tanke.


Google AppEngine + IntelliJ, a Step-by-Step Guide

Setting up a new Google AppEngine project in IntelliJ is easy-peasy once you know how. Here’s how:

Project Setup

  1. Create project from scratch
    • type: Java Module
    • enable creation of source folder src
    • check Web Application in the “select technologies” window
  2. Configure project structure
    • Project SDK should be 1.6 (though 1.5 should work too)
    • Add dependency to library Google App Engine (containing appengine-tools-api.jar)
  3. Create config file
    • Create appengine-web.xml in WEB-INF with the following contents:
      <?xml version=”1.0” encoding=”utf-8”?>
      <appengine-web-app xmlns=”http://appengine.google.com/ns/1.0”>
      <application></application>
      <version>1</version>
      </appengine-web-app>
    • If you know what application name you should use, go ahead and fill it in.
  4. Create servlet
    • Right click project root, choose New -> Servlet
      This will create servlet class and update web.xml as needed.
    • Add a servlet mapping in the Assembly Descriptor tab.
      NOTE: Make sure the URL Pattern starts with a slash (/).
    • In the servlet’s doGet method, add the following:
      response.setContentType(“text/plain”);
      response.getWriter().println(“Hello, world!”);
  5. Create runner
    • Create new application configuration
    • Main class: com.google.appengine.tools.KickStart
    • Program parameters:
      com.google.appengine.tools.development.DevAppServerMain out\exploded\[your-project-name]Web
    • Environment variables:
      SDK_LIB=C:\lib\appengine-java-sdk\lib
      SDK_CONFIG=C:\lib\appengine-java-sdk\config\sdk
      (where it is assumed that google app engine SDK is located at C:\lib\appengine-java-sdk)
  6. Open page in browser
    • Navigate to http://localhost:8080/[your-url-pattern]
    • NOTE: To stop/restart the app, use Exit (exit) rather than Stop. Otherwise Jetty will keep running in the background.

Deploying the application

  1. Update the <application> tag in appengine-web.xml so it contains the Google app-id of your project.
  2. Upload to server.
    • If you have set up an external tool (described below), simply invoke the tool from Tools > Google App Engine > Deploy
    • Otherwise, perform the following steps to deploy manually:
      • Open a command line window
      • Navigate to the app-engine’s bin folder
      • Enter: appcfg.cmd update [full-path-to-intellij-project-root]\out\exploded\[your-project-name]Web
    • Enter Google account info when prompted.
    • NOTE: If appcfg.exe reports it cannot find javac.exe, it may be necessary to edit the appcfg.cmd file:
      Instead of invoking “java” (which is specifying whichever java happens to be on your system path), use the fully qualified path of the 1.6 JDK’s java.exe.
  3. Open page in browser
    • Navigate to http://[your-app-id].appspot.com/[your-project-name]Web

Setting up a new External Tool in IntelliJ

  1. Open the Settings menu (Ctrl+Alt+S) and click External Tools under IDE Settings.
  2. Click Add and use the following properties:
    • Name: Deploy
    • Group: Google App Engine
    • Description: Deploy to Google App Engine
    • Menu: “Main menu” checked
    • Open console: checked
    • Synchronize files after execution: checked
    • Program: C:\lib\appengine-java-sdk\bin\appcfg.cmd
    • Parameters: update $ProjectFileDir$\out\exploded\$ProjectName$Web
    • Working directory: C:\lib\appengine-java-sdk\bin

Riksmålsbrum

Det sner, det sner

Tiddelibom

Det er det som skjer

Tiddelibom

Nå sner det bare mer og mer

Tiddelibom, og huttemeitu


Når du er sliten, er det ikke kroppen som prøver å fortelle deg at du trenger kaffe

Det virker som en vanlig oppfatning på kontoret er at når du er sliten, er det kroppen som prøver å fortelle deg at du trenger kaffe.

Du ser sjefen gjør det. Han har hylende unger, du ser natteskrikene deres ligger igjen utenpå huden hans. Den daglige lederen har skjeggstubber og er rød i øynene, hjemme hos ham er det han som har nattevakt. Men de vil så gjerne. De vil få det til, de vil at det skal gå rundt, de vil tjene den millionen i år. Det går jo bra. Jeg heller meg en kopp kaffe.

Vi kan alle strekke oss litt lenger. Det er ikke noe problem. Selvfølgelig er jeg sliten etter en natt med hylende unger, men jeg kommer meg da på jobben. Jeg sitter her og jobber. Jeg drikker kaffe, og får dagen til å gå. Og jeg gjør det samme imorgen. Det er ikke skadelig å være sliten, er det? Slutt å kødd, `a, alle er jo slitne.

Tja. Får du ikke nok søvn, øker du sjansene dine for å få kreft, hjertesykdommer, diabetes, og sykelig overvekt. Du får redusert glukose-meatbolisme, økte kortisolnvåer i blodet (mer stress), og mindre veksthormon, noe som gjør at skader du får, leges saktere. Du følgere dårligere med, og får dårligere hukommelse.

Det er underlig hvor klar tale kroppen kommer med, og hvor villig vi mistolker den.

Hvis du ikke lar kroppen følge sin naturlige syklus med hvile og arbeid, vil den etterhvert bli dårligere i stand til å regenerere, selv i de periodene den hviler. Og kroppen har ikke bare natt-dag-sykluser. I løpet av en dag føler du effektene av andre rytmer — du er gjerne sliten i 15-tiden, før du kommer opp igjen. Og du kan jobbe i 25-50 minutter før du trenger en skikkelig pause.

Det er ikke noe galt i å drikke kaffe. Eller i å jobbe hardt. Bare husk på livets rytme. Jobbe. Hvile.

La meg banke det inn i hodet på deg: Når du er sliten, trenger du hvile. Og du får lov. Du får lov av meg.

Capiche?


Smarte kunder kan få lavere konsulentpriser

Karl Philip Lund presenterer en spennende tanke i bloggen Stammen.no: Som AdWords-konsulent har han tenkt mye på Googles strategi for å få annonsører til å skape annonser som er relevante for søkerne. Google er nemmelig avhengige av at den jevne bruker finner akkurat det han er på jakt etter når han søker, for at han stadig skal vende tilbake til Google. Det gjelder også de betalte annonsene han får i trefflisten — det nytter ikke med søppeltreff der. Alt skal være relevant og bidra til den gode søkeopplevelsen.

Google har løst dette ved å belønne dyktige annonsører. Dette gjøres ved hjelp av enkle mål. Google teller hvor mange prosent av søkere som klikker på en gitt annonse når denne vises. Annonser som prosentvis blir klikket på oftere, får en lavere pris-per-klikk for annonsøren. En annonse som konverterer høyt (har en høy click-through ratio, eller CTR) vil altså gi en annonsør flere besøkende til sine websider for samme eller lavere pris, enn en annonse med lavere CTR.

Konverst, er den andre måten å komme høyt opp og bli vist ofte i Googles betalte søkeresulateter,  å betale mye per klikk. I bransjen blir dette kalt “paying the stupidity tax.” Er du ikke lur nok til å skape gode annonser med høy gjennomklikksratio, må du betale gjennom nesen for å synes hos Google.

Karl Philip poengterer at som konsulenter tar vi kundens “stupidity” med i beregningen når  vi kalkulerer timepriser og estimerer prosjektlengde. Kunden vet ikke hva som skal til for å lage en god løsning. Han kan ikke uten videre stille til rådighet de ressursene vi trenger. Det finnes selvfølgelig “profesjonelle kunder” også, men de er i fåtall, og vi vet dessuten ikke hvordan vi skal måle denne “profesjonaliteten”. Google vinner fordi de har konkrete målbare tall som sine kriterier.

Kunne vi som konsulenter også definere målbare kriterier for våre kunder, så vi vet de er “lure”, så de kunne slippe vår stupidity tax, og samarbeidet kunne vært mer fruktbart? Kunne vi kreve at de leste visse bøker, og tok en online eksamen? Ville det gi et godt nok grunnlag for lavere timespriser?

Spørmålet som melder seg da er opplagt: Hvorfor skulle jeg ønske å ta lavere timespriser? I prosjekter som går fortere? Det må jo være den verst tenkelige løsningen?

Over tid, argumenterer Karl Philip, vil en slik strategi tiltekrekke seg dyktige oppdragsgivere. Den innleide ekspertisen blir motivert av høye krav og samarbeide med dyktige folk. Og dette, sier Lund, er det lett å tenke seg fører til en høyere suksessrate, og at terskelen for å starte nye og spennende prosjekter blir mindre.  Videre: “Når suksessraten øker, blir konsulenten mer attraktiv for nye arbeidsgivere. Dermed øker etterspørselen etter konsulentens tjenester og man har mulighet til å øke standardtimeprisen.”

Dette er en spennende tanke jeg tror det er verdt å forfølge. Hvem er tøff nok til å være den første?

Du finner Karl Phulip Lunds artikkel på stammen.no.


Google API Playground

Jeg skulle bare embedde et google kart i en webside i kveld, og dermed ramlet jeg over Google AJAX APIs Playground. Ordentlig stilig, nyttig, og morsomt, og med en “firebug lite” til å hjelpe deg med debuggingen. Så da ble jeg påminnet om at mitt neste språk ikke burde være Erlang, men JavaScript! (”There’s a real programming language in there” – Glenn Vanderburg)


Hvordan lande drømmeprosjektet? Med eksempel-CV!

Slashdot har en historie ikveld om hvordan du  som programmerer selger ferdigheter du har fått gjennom open source – prosjekter, men rådene gjelder for alle som jobber på prosjekter, og som skal selge seg selv videre i neste prosjekt. Du stikker seg ut, sier forfatteren Zack Grossbart, ved måten du snakker om prosjektet på. Hvilke features jobbet du med? Designet du nye deler av systemet? Ledet du møter?

Full story hos Slashdot. Linken til CV er nederst i artikkelen.

Nært relatert er også Zacks tanker om “personal branding” og “hvordan formattere en cv“.


IntelliJ IDEA kommer i Open Source versjon

En public preview-versjon av IntelliJ IDEA’s gratis “Community Edition” har nettopp blitt tilgjengelig for Mac, Windows, og Linux. Community Edition mangler bl.a. UML, Android, JavaScript-debugger, html, og php – støtte, men kommer med det meste du trenger for de fleste prosjekter, slikt som Java, Groovy, Java ME, Ant, Maven, JUnit, og en GUI builder. Full sammenligningsmatrise her.