Programmerer.com

Keeping fun in the house

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.

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

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«.