Tuesday, December 29, 2009

A new term for what we do



I started a new part-time project a while ago where I was allowed to use the full power of thin server architecture and Dojo, where the back-end was written in PHP.

While talking about the architecture with the back-end developer (which was really impressed about the cleanness of using a SMD file to define the protocol contract between client and server) we compared experiences and realized that we were both programmers first and visual designers last, if at all.

Many times the customer or project owner have a very dim understanding of client-side development, which leads to bizarre ideas about the simplicity of implementing ideas in the browser. Most common is that JavaScript is seen as something to use as a last resort and that the entire user experience is seen as a series of 90s cardboard static HTML pages, mainly because it's simpler to conceptualize, I guess.

Working the majority of my time with web pages but never with visual design means that I need to find very advanced customers and project members who understand that there is a layer below the design, but not on the server.

And that's when the expert PHP developer I was working with (Henrik Hussfelt, no less) coined the term middle-end developer. I have never heard that before, and IMO it resonates with where I put myself in the value stack.

Could a new definition like middle-end be a tool to more precisely define the JavaScript programmers role; Not as someone who adds an event handler to a button, but someone who creates the actual client application, but not the markup template for it.

Monday, December 14, 2009

GTUG Stockholm meeting December 2009

Like the happy crazy people we are, we had a GTUG meeting only days after the Android Hackathon. The upside of that was that we could have a recap for those unfortunates who didn't have the time or ability to attend.

About 30 people came, which is OK, but made me think maybe we should do the meetings bi-monthly instead of every month. Not sure either way, but I'll decide after next meeting.

The people who came were as always from a lot of different companies; Spotify, formerly of Spotify, Voddler, Qbranch and many others.

After my short introduction and talk on some new Google technologies (Mostly Closure) Tommy Widenflycht from Google Sweden did a talk on Google recruitment and then answered questions for a long time, handing out frisbees and hats to the best ones.

Apparently, there's a need for really talented Server-Side coders (C++/Java) and A/V Codec programmers in the Stockholm office (and elsewhere). If you feel that you fit the bill, contact me by direct email (psvensson@gmail.com) or comment this post and I'll make sure you get to talk to the right people.


Then it was time for the much-anticipated JavaScript on Android talk by Mikael Kindborg. I was really impressed with the research Mikael had done and what he had managed to do.

First he had compiled Rhino for the Dalvik VM and used that to parse incoming JavaScript string. So far, so good. To do that he had made a simple JavaScript app server called RhinoDroid (You can get it here from github) that made it simpler to push JS from an external source (like a browser, or in Mikael's case, the Squeak Smalltalk environment. That's was really cool in itself. What happened then I could have understood if I had thought about it, but I hadn't had the time.

Since all Android APIs (that has been compiled into the RhinoDroid app) are accessible by the JavaScript script when running, Mikael showed how he could build up a simple Android interface asynchronously, adding some buttons, which popped up on the Androdi screen, push those a bit - nothing happens.

Then send some JavaScript event handlers that bind to those buttons, which get dynamically evaluated and then the button do something. So he was building an Android UI - and changing it - in realtime. Think about that for a while.


The next talk was Johan Burell who did a run-down of the Android Hackathon the previous Saturday; Which apps had been created, which ones had _almost_ been created, and so on. Several people who had been present was in the audience as well, so we had some recaps and discussions about team @froderik's Android Hudson front-end and the other apps as well.

The last talk for the night was by Sony Ericsson's strategy manager Thomas Bailey, who did show and pass around an actual X10 Android phone. It's surprisingly and reassuringly heavy and a screen that is 'right' sized. The interesting parts of Thomas' talk was the fact that Sony Ericsson is starting their own Android App store, to be able to offer developers a more controlled environment to publish their apps to, and Sony Ericsson's signature apps (Organizing and formatting activity streams and media) which will exist only on their phones but can be extended using XML files, which will pop in future sources of contacts, media and other things, which is a neat concept in itself.


Our next meeting will be on January 14th, where we will cover the following topics:




  • Peter Svensson - State of the code (+some Dojo layout goodness)






  • Ingemar Resare - Google Apps use cases.





  • Peter Sönnergren - App Engine + Java




  • Johan Burell - Google Go (+ Android Cntrllr)




  • Leonard Axelsson - App Engine + Groovy




  • See you guys then, and a Merry Spaghettimas to you all!
    Cheers,
    PS

    Wednesday, December 9, 2009

    Full Brighton

    And actually, this blog *should* be about how to avoid common pitfalls when using Dojo widgets inside hidden ContentPanes (as when using Stack- or TabContainers), but I have a huge queue of, oh, two or so posts to go before that.

    Todays topic is of course the unreasonably nice JavaScript conference in Brighton recently - Full Frontal.

    I have never been to Brighton before, and one of the experience was walking about the city itself.

    Which despite the pedestrian nature of above statement is not particularly easy, even if it's nice (sharing properties with several other activities I could think of..).

    The reason for the lack of simplicity is that the city is actually at least two cities, which don't like each other very much and have crashed into one another in a desperate struggle to the very end, throwing streets and towers as you please, leaving the unwary resident in crossing with no less than three busy streets, often multiples of that, where two or more have steel railings to avoid being crossed in reasonable manners.


    I had managed to hitch a ride out of the airport with @icaaq, or actually @icaaq's cousin, who was living with her family in Brighton since years back. After a quick freshening up in the Hotel room I managed to get to something I believe is the west end of Brighton which is chock-full of pubs, of which me and a motley crew of web developers, media folks, CEOs, CSS gurus and JavaScript madmen went to at least three (or so they say).

    The evening was punctuated by Christian Heilman was nice enough to lead the way to the actual beach (at 2am) to see a work of art of some sort, where I managed to take a photo of him and Lieke Arendts of Ajax.org and Javelin fame (uppermost above).

    The conference was set in a beautiful fin-de-last-but-last-again-ciecle cinema named Duke of York Cinema. You know what? All conferences should be in cinemas. Problem with ventilation? Nope. Too hot or cold? No way. A cinema is made for large number of people sitting for a long time looking at whatever's up on the stage. Perfect!

    And was it great! One of the best things was that I wasn't even speaking. I had no last-minutes slides to perfect, no slow parts of my talk to worry about - nothing. I could just sit down and enjoy the show.

    But even though JSConf.eu wins due to the sheer amount of good content, Full Frontal still manage to out-wattage JSConf.eu on the mere fact that it was *so* right in just one day, managing by luck or engineering to get almost every speaker not only be the right kind but sort of building upon each others talks.



    Everything was good, but the absolute highlights for me was Jake Archibalds talk on JavaScript optimization. Not only for the hard data on what to do and not to do - between different browser, but he had a stunning presentation technique. First of all his slides were top-notch (can he possible be that skilled? Or do he have some secret connections in the Beeb's media departments?), and secondly he had a comic timing that made his talk the most fun-packed of the day.

    He had this slide of a He-man doll, which he referred to as the power of the JavaScript VMs of the moderns browsers , but crossed with terminator (next slides showing he-man with Borg eye), and a crustacean forming a battlecrab! (bext slides showing a cyborged he-man doll with a large crab-like derierre), and so on. I don't make him credit, but it was really great.


    The next best part was the closing act, where Simon Willison had ditched his prepared talk (something about web APIs) after seeing the presentations on JSConf the week earlier, and promptly slammed together his own talk on node.js, using fluffy rabbits, cute hamsters and octopuses (OK, just one octpus), to describe the difference between threaded event handling and event-callbacks.

    The talk had just the same effect on Full Frontal. people whooped and became generally agitated about the idea to use their front-end kung-fu to start building heavy-hitting serve-side stuff as well. No new idea (and the Javelin guys were quietly commenting on their own KLOCs of C++ to make their own SSJS platform one of the speediest, doing essentially the same - and more), but the magic bullet here is one of perceived complexity; Noone in the room thought that they would have a hard time picking up node.js and try something out with it. Just as with CouchDB, it simple to explain and simple to use. Well, OK, I'll shut up about it for now, but expect me to be back on the topic!

    Anyhoo.. the after-party was nice, full of back-clapping and camaraderie,and just the right size too. I think that the superpower of the current JavaScript movement that's building is twofold; people are super-amateurish and quirky, and also nice. Really, really nice.

    Amateurism in really bright people means playfulness and a lowering of barriers, so that using hamsters for request is seen as OK - not very academical, but fun and getting the point across.

    I'll definitely be back next year (there too :)

    Cheers,
    PS

    Tuesday, December 1, 2009

    GTUG Android Hackathon 28/11 2009

    Earlier this year, I had an idea for an all-day event for hacking on some Google technology. When I proposed this to the group at a GTUG meeting, I was reasonably certain that Wave was going to be chosen as the technology in question, and to my surprise instead Android took home most of the votes.


    So, Android it was. No worries, though, as I'm a great friend of the platform - even though it is still officially restricted to Google's brand of Java, but more of that this Thursday when Mikael Kindborg will do a talk on JavaScript on the Android, among other talks (including Sony Ericsson's Strategy Manager Thomas Bailey).


    The process running up to the Hackathon was almost Kafkanesque in nature. Not at the beginning, where Bwin Games agreed to host the Hackathon (on a Saturday) at their lavish premises in central Stockholm. Later, when it was apparent that the budget was rather tight at Q4 (in (yet another) year of recession) to provide dinner - something I felt was a necessity for an event stretching from 9.00am to 8.00pm.

    After getting literally dozens of great leads after I reached out to the community, on twitter (I'm @psvensson) and beyond, I had as many as four different companies that tried to find resources within their organizations to no avail (but thanks for the effort nonetheless!). Finally I got a possible sponsor, but then it turned out that sponsorship is a sensitive issue and the company in question had agendas parallell to that of Bwin for providing the venue in the first place.

    With only days left, I had to call in the cavalry and use my contacts at Google (Thanks Serge and Stephanie!) who agreed to take the bill for the dinner.

    What? You want to know about the Hackathon and not my orgnaizational ramblings? Why didn't you say so? Here goes:


    As many as 49 people had signed up for the Hackathon, 43 on LinkedIn and 6 by direct email, and after all was said and done 33 showed up, but what a group. We got people from Plusfoursix, Isotop, everbody from Appcorn (who had attended whole day iPhone developer event the day before), HiQ, COMBOL and many others.

    Several people came just to see Dirk Groten, CTO  from the progressive Augmented Reality company Layar, who had graciously agreed to come up to Stockholm and demonstrate how to build service and applicaitons with their system. Layar is just at the time of this writing about to reveal their new polygonal 3D service, which lets developers created fairly complex polygons at specific geographical locations, which ups the ante a bit.


    After Dirk, we had a talk from our own Johan Burell, who had a thorough walk-through of the Rokon gaming library for Android, which provides a lot of simplifying wrappers for 2D gaming, which several of the groups later used.

    After the talks were done, we had a light but satisfying wraps-based lunch provided by Bwin and then on to coding.




    The atmosphere during the whole day was very open and friendly. Teams helped each other out on several occasions, fixing solutions to MapView dynamic updating to getting the current GPS position.

    Also, there was (at least I had quite a few :) a lot of general discussions on and off, about whether it was amoral for Craigslist to provide free advertising, thus putting newspapers out of business, the recent split of the Squeak Smalltalk platform into Pharo, CouchDb REST musings and lots of other stuff.

    What I mean to say is that these coders weren't your garden variety lockergnomes, these were hard people, OK? just saying :)


    Some teams borrowed meeting rooms from Bwin to doodle on white boards, but most teams huddled down in groups, hacking intently as the dusk fell over Stockholm. Actually, dusk was all we had that day, steel-blue clouds and a mere thirty seconds or so of sun.

    At the end of the day, each time got one minute - sometimes a verrry long minute - to present their application. After everyone had presented, everybody present (some people had to leave before the presentations) voted by raising their hands (only one vote per person) on the app they liked best - and one was not allowed to vote for ones own. As it turned out first price went to the Bwin team with their app "Crimesweeper", which got real-time police crime scene data, and mashed it up in a MapView, awarding points for players who visited the scene (vigilante.apk?)


    The second-price winners had made a very creative game app which tracked the players and plotted them on each others screens, and provided a method for throwing virtual water baloons at each other.

    Then one team had made a very useful Hudson front-end for Android where you could start Java build jobs and check their statuses.

    One team had made almost a space shooter with the Rokon library, but due to time constraints it was actually a "space dodger" - tasteful nonetheless.
    There was an app which demonstrated a CouchDB library for the Android, something really useful.

    One app which was made by an attendee who was forced to leave before the voting (please comment if you remember who - thx!) made an app for kids learning words using images and rotating letters - which was very appreciated, but got few votes. Strange, but what do you do? :)


    We had another app by single-team @sharj, which used the twitter API to get a random twitter user bio and let you follow if you liked it. In the future he means to add support for recommending users based on usage patterns.

    And he got another one as well, which used the recent Google Movies API to list movies and to say which ones you were going to see, foursquare-style, of sorts.

    @burre83's team made a rhythm-action app, which was surprisingly catchy, tempting the player to hit random parts of the screen in time to the music.


    A couple of teams did not finish, but a couple came surprisingly far, given their ambitions.

    What was interesting was that so many teams had such divergent  ideas, and that so many attendees came without really any prior Android development experience - and still managed to produce runnable code!

    The winners and the second place teams got each a book from Apress called "Pro Android" which in my opinion is the most comprehensive one out there. The winning team also got some really nice Google drinking bottles and my very last Android keyring trinkets,which were much appreciated.


    This left me with a couple of books left (since Apress had sent me 10), which after due consideration was given to to teams which I felt needed them the most, for different reasons.:)

    When everything was wrapping up, we decided to go down to the local pub Bishops Arms at Vasagatan for some beers and lots of discussion - some about Psytrance and scouting if I recall correctly.

    In retrospect the day went very smooth, mostyl due to the playful professionalism of all present. Also, since most of the day was spent by the attendees hacking I had several hours on and off where I could blog about my adventures in Russia and other events that needed some writing.


    This had been hanging over me for some time, and it felt really good to be in a position to do something about it, between coaching sessions and general discussions.

    Something that really meant a lot to me was that three separate people, on separate occasions, went up to me and said how great they thought the event was and thanked me for arranging it. Me, who really didn't do much in particular, other than yakking and blogging :)


    Thank you so much! ^-^

    Saturday, November 28, 2009

    From Russia with ow!

    So, I had this meeting. The rationale behind it went something like this; Google will soon be releasing certifications and courses related to those certifications to developers. That mean not only 'learn how to administer adwords' but 'learn how to develop with the Maps API' or 'learn how to make a decent App Engine app in Python', that kind of stuff.

    OK.

    I was talking to Shannon, who is a training and documentation manager at Google, about starting up a Swedish Qualified Education Center focusing on hardcore development rather than administrative tasks. She was going to be in Europe in the beginning of November, together with Stephanie, my GTUG boss (and a lot of other people) doing the Google Developer Days in Prague and Moscow. I was going to go to Berlin the very day of the Prague GDD, so my only option was to met her in Moscow.

    Now, Moscow isn't really Europe. At all. Whatsoever. Regretting my decision daily, I began the ridiculously Kafkan process of applying for a Visa for Russia. The most poignant memory of that was realizing that they would keep my passport for a whole week (no doubt shipping it by nuclear submarine to Irkutsk to be steamed open and copied to numerous spetsnaz operatives), which had me standing in line to get my passport back in the morning, the very same day I was flying to Berlin!


    Also, I was home about 8 hours from Jsconf.eu before getting in the Taxi again, going to the plane that was taking me to Moscow, seeing my family only briefly.  After arriving to the commandeered cinema where the GDD event took place, I recognize the Hookah lounge from pictures Stephanie has posted on twitter (which was very helpful).


    I then try (after doing some panic work for one of my favourite clients, involving a Layar REST endpoint) to talk to Stephanie (pictured with wine above, which I served her and Shannon on a Gitub coaster, courtesy of the github developers I met at jsconf) and Shannon about my training center plans. However, the place is quite noise, and a lot of people come in and ask questions about Google things, mostly directed to me, not even being a Google employee - I'm just the unofficial PR manager :).


    After the evening progresses (and I haven't even checked in to my fairly remote hotel yet, schlepping around my computer case), I get invited to a Google post-conference dinner with the speaker and arrangers of the day. It was really cool to meet and shake hands with some of the Wave team, the EMEA Sales manager (hi Timbo!), The PM for the V8 JS Engine (Hi Anders!) and lots of other really cool people.

    Here's a pic where the Wave team respond to the "Who wants vodka?" call. And as you can see, the food was epic. Grilled cheeses, soups, sausages, blinies, pancakes, breads, pies and so on. Thank you (again, for the tenth time) so very, very much.

    Naturally, there's no real time to talk shop during the dinner, so in the wee hours, Shannon and I agree to meet the next day at the Moscow sales offices instead. Great. No problem. The very nice Russian head of office (whose name I've forgot - sorry) helps me get into a cab on the street, where he negotiates price, direction, duration, associations and who knows what to put the driver in a customer-friendly mood.

    However, after 45 minutes we start to veer out into industrial areas, spotty lighting, semi-rural fields and people sitting and drinking on the sidewalk. Here my driver stops and walks out of the car.


    It turns out he's asking directions from the drinking people. Good call. Sort of. He gets back in, swerves around and starts backing up for a long, long way, going here and there after that in the adjoining industrial neighborhoods. It's in the middle of the night, the driver doesn't speak English and he don't know the way. Great.

    Eventually, to spare you more details, he does manage to find the hotel, and I collapse in the surprisingly roomy 'suite', knowing that I have to get up in six hours to get to the actual meeting back in the city center. Woe to you oh earth and sea, et.c.


    Then the taxi I managed to get hold of tries to renegotiate the price when we start driving, which gets me so mad, I scream at the driver to stop immediately and open my door without thinking of the consequences. We'travelling quite slowly, and the driver gets kind of upset - but so am I. After some intense broken English negotiations, I get the original price and our drive continue in a communal, surly silence.

    When I arrive at the sales office, two things are apparent; 1) There's no Shannon working there (I know, she's from the MTV office) and there's no meeting scheduled (since it was agreed upon in the middle of the night), which makes the security-minded secretary less than open towards my feeble efforts in trying to stay in the office. Just when I really have to leave, before the situation becomes unbearable, Shannon calls the office. That first picture with me in front of the Google logo is taken in the sales office, which happened to be the wrong office. Time for another quick taxi across town..


    It turns out that a quick dash across town takes almost an hour, at which time Shannon is 15 minutes away to take her own cab back to the airport. I do find time to get my picture taken in front of the other office's logo and steal up on some iced tea (thanks!).

    In the end, we conduct a very interesting meeting in the very cab back to the airport, even if it finds me twiddling my thumbs for a number of hours, waiting for my own flight to come up.

    It was a roller-coaster adventure, buffeted only by the kindness of Google employees along the way. I would have had a much rougher visit ion Moscow without access to the right people (including my own connections who picked me up at the airport; Hi Alexander!), but then again, without those very people it would never had crossed my mind to visit.




    Cheers,
    PS

    November GTUG Stockholm Meeting

    My apologies for not having time to blog about this sooner (Hi Steph! :) but there you go. The 5/11

    meeting was a bit shorter on attendance than what we were used to. It turned out quite that at the very same day, we had attendual interference from the week-long Öredev developer event, a local Java users group meeting and an open house day at The Royal Technical Highschool (IIRC), so we got somewhere between 40 and 50 people (of which only 30 or so registered - due to some people showing up a bit late, things happens).

    The order of the day was yet another Wave demo with some focus on how a Wave bot works (I used the Wolfram Alpha source code), and a thorough 2-part talk by Jonas Burell on his upcoming open-source collaborative music-making Android application called Cntrllr.


    Since I had two different speakers defaulted on their presentations for this meeting, I threw in a beta of my upcoming Jsconf.eu talk on dojox.gfx cross.browser 2D graphics.

    As always there was a lot of great discussions over a broad range of subjects of beers and sandwiches in the pauses in between talks, and as always great and passionate people attending. Did I mention I like arranging these things? :)



    Cheers,
    PS

    Tuesday, November 24, 2009

    The German Connection

    Hoo boy, I'm still tired from Berlin :) Or maybe it's the accumulated trips that have caught up with me. Either way it has taken me some time to get around to unload the camera and sleep and work and.. oh wait, I just realized I had planned to post about the latest GTUG Stockholm meeting. Oh well, next up I guess.


    I missed the original and first JSConf in Washington, since I had a client default on me at around that time. No nice experience, double so because of missed attendance.

    I was dead set at not missing the European JSConf.eu at any price, and was more than happy when I was admitted as a speaker with my dojox.gfx talk. I had never been to Berlin before and to Germany only once, twenty years ago (yes I am that old!), so I had no idea what to expect, really.


    Well, two things stuck me at once: 1) Berlin is *huge*, 2) It's also beautiful. Due to the first fact, you have to take Taxi everywhere (which generally a) lack onboard GPS and Maps R2D2, b) lack any card readers, forcing you to luggage around lots of Euros).

    Oh, the conference? The conference was a huge success, but more than that it was immensely enjoyable. Day one had a great opening by Dion Almaer (now, as we all know, of Palm).

    What I took away from most of the speeches is that I probably need to brush up on the noble art of making slides. Dion's presentation was fun, tons of fun, and also very nice to look at. What do I have? Slapped together pictures and pages of code. Not much fun that :) Actually, that was also a theme underlying much of Dion's speech,something I know but don't react enough on - sex sells, people want to have fun, et.c.


    Some other notable talks was Remy's HTML5 presentation (mot least because it contained Sharks with lasers!), The cappuccino presentation by Francisco Tomalsky was also really good, but after a lot of head-wrangling I feel that I somehow still want to code my clients and that the WYSIWYG will only get in the way. Well, right, they had stellar support for hand-coding as well. OK, OK, I admit it, I'm just jealous. There, I said it, can we move on?

    The CommonJS and Server-Side JavaScript in general lay as a barely audible hum throughout the two days of presentations. A comment from Malte on how he had used Joose on the server-side, the OpenAjax guys (Hi Lieke, Mike and everyone else from Javeline), naturally who made their very own SSJS VM, and lots of other comments in and around the talks made SSJS feel very present.

    The natural focus of Server-Side would of course had been Kris Kowal's CommonJS talk, which was very good in itself, but what really dropped a bomb was @ryah's node.js unveiling. Naturally, as everybody (now) knows, node.js has been going on for over half a year, but it hasn't had lots of attention. Until now. What got our attention was the off-beat assertion by Ryan

    that using thread-based logic was doing everything wrong.

    He talked about how he had done quite a lot of advanced magic (with threads, inside node.js) to be able to expose system events, pipes, sockets and services to be handled by JavaScript callbacks- that is node.js.

    By implementing non-blocking I/O and using event handlers instead of threads, the logic for common servers and services could be made much simpler.

    He had a simple IRC server going, which was implemented in its entirety in JavaScript. I have done some of that before, having fiddled with 10gen's application server, but instead of living inside Rhino, node.js includes the Google V8 JavaScript VM, and exposes system services, such as streaming file operations and DNS lookup (non-blocking you see :).

    I could go on, and probably will, but for the record, node.js was the mount everest peak ascent, or maybe Roswell crash of JSConf. Nothing will be the same ever again. But in a good way.


    And the partying was excellent. I finally got to met the Uxebu Dojo folks, including Nikolai Onken (@nonken), PHP, github and jQuery people, including @paulca and @furf (who just had reinvented deferred's (something I've never done)) and lots and lots of other people, champion drinkers one and all.

    Almost noone managed to get hit by quick bicycle ladies in the early morning, and most of us got some sleep between the two conference days, but it was a total blast. I had also a small request from @frebro who has designed my business cards - could I possibly take a photo of them in a cool setting? Not to let him down I shot them together with both Remy Sharp and

    Douglas Crockford, who were nice enough to lend their star quality to my nefarious purposes.

    The day I was travelling home, on Monday, I had planned to do some general shopping four hours before the plane should lift, and then take a quick taxi to the airport some two hour later.  Little did I know that this specific Monday was the 20 year celebration of the fall of the Berlin wall, unification and so on. The traffic stood practically still. it took me nearly all of the time I had to get to the airport in time.

    I arrived home late in the evening, fully aware that I was leaving for Moscow 10.20 the day after. but more of that in another blog post.


    And that's me in the middle. The long-haired, thin guy without a beard.

    Cheers,
    PS

    Sunday, November 8, 2009

    My JSConf presentation

    So, still a bit tired from yesterdays awesome Nokia-sponsored party at Homebase in Berlin, I managed to survive my presentation on dojox.gfx, cross-browsed native 2D graphics. I got a lot of comments from people afterwards that they had no idea that this existed, which made me even happier for my subject choice.

    And without further ado, here's the slides:


    Cheers,
    PS

    Friday, October 16, 2009

    Yak Coiffures



    I am a very emotional and 'colorful' person and tend to rant quite a lot about things that I deem important. Lots of those happens to fall inside an body of supposed knowledge called 'software engineering'.

    I am often talking about the importance to find ways to cut down the time being spent when developing a program that is not actual programming. Currently, I'm using 'find . -exec grep ..' in various parts of various repositories trying to understand how server-side templating is causing subtle bugs in a pedestrian, yet important web service, for a customer.

    But never mind that. What I want to write about today is a simple rule to follow if you want to weigh your language and/or platform of choice in terms of complexity.

    Assertion: Every step that produces an intermediate file creates complexity.
    Example: A compiler takes source code files and generates binary files.
    Why: Each step that converts files between formats must be managed and maintained.

    This is pretty hard to object to. Really. If you use Java, you need to manage compilation by either an ant file or maven, or perhaps a custom shell-script. These need to be maintained. They will not be maintained. This will lead to grief.

    If you need to package your generated files before deployment, the script for that needs to be maintained. See above.

    These operations are hard to duck, but that doesn't mean you shouldn't try. Every time you get one extra dot between yourself and the final, running application, that dot needs to be maintained. And that means documenting it, integrating it into other subsystems, referring to it, checking it in, adding it to a repository, what have you. Every point.

    Also, frequently, they will become stop-blocks that makes it impossible to do things, until they guy that does packaging comes in, et.c.

    One of the simpler ways to minimize yak-shaving of this kind is to adopt a scripting-language as your server-side language. Whether it is Groovy, SSJS, Ruby, Python, PHP or anything else is beside the point, because the main point is this;


    • A scripting language gets compiled inside the VM.
    • A scripting language has at least two steps less complexity than a compiled one
    So whatever you do, for future generations of programmers: Never, ever again use a compiled language, for any project, for any reason.

    Just Say No! :)

    Cheers,
    PS




    Monday, October 5, 2009

    Todays status of the Wave (unofficial) Invitation Queue Tracker

    There's a Wave for people to track when their invites was sent out and when the recipients of the invites got it from Google. Since I have eight wandering invites myself, and a lot of people have asked about it, here's the current status of the tracking list:


    First Nomination Sent— First Invitation Received (delay DD:HH:MM)
    2009-09-30, 16:30 UTC — 2009-10-01, 08:20 UTC (00:15:50)
    2009-09-30, 17:30 UTC — 2009-10-01, 04:20 UTC (00:10:50)
    2009-09-30, 20:43 UTC — 2009-10-01, 08:44 UTC (00:12:01)
    2009-10-01, 02:00 UTC — 2009-10-01, 23:30 UTC (00:21:30)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:07 UTC (00:19:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 22:07 UTC (00:18:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:00 UTC (00:19:00)
    2009-10-01, 04:30 UTC —
    2009-10-01, 05:10 UTC —
    2009-10-01, 05:30 UTC —
    2009-10-01, 06:45 UTC —
    2009-10-01, 06:59 UTC —
    2009-10-01, 07:00 UTC —
    2009-10-01, 07:15 UTC —
    2009-10-01, 09:00 UTC —
    2009-10-01, 10:00 UTC —
    2009-10-01, 11:45 UTC —
    2009-10-01, 13:30 UTC —
    2009-10-01, 16:30 UTC —
    2009-10-01, 16:40 UTC —
    2009-10-01, 18:00 UTC —
    2009-10-02, 15:00 UTC —
    2009-10-03, 00:30 UTC —
    2009-10-04, 18:55 UTC —

    [UPDATE 2009-10-6]



    First Nomination Sent— First Invitation Received (delay DD:HH:MM)
    2009-09-30, 16:30 UTC — 2009-10-01, 08:20 UTC (00:15:50)
    2009-09-30, 17:30 UTC — 2009-10-01, 04:20 UTC (00:10:50)
    2009-09-30, 20:43 UTC — 2009-10-01, 08:44 UTC (00:12:01)
    2009-10-01, 02:00 UTC — 2009-10-01, 23:30 UTC (00:21:30)
    2009-10-01, 03:00 UTC — 2009-10-01, 23:53 UTC (00:20:53)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:07 UTC (00:19:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 22:07 UTC (00:18:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:00 UTC (00:19:00)
    2009-10-01, 04:30 UTC —
    2009-10-01, 05:10 UTC — 2009-10-06, 06:27 UTC (05:01:17)
    2009-10-01, 05:30 UTC —
    2009-10-01, 06:45 UTC —
    2009-10-01, 06:59 UTC —
    2009-10-01, 07:00 UTC — 2009-10-06, 06:45 UTC (5 days)
    2009-10-01, 07:15 UTC —
    2009-10-01, 09:00 UTC —
    2009-10-01, 10:00 UTC —
    2009-10-01, 11:45 UTC —
    2009-10-01, 13:20 UTC —

    2009-10-01, 13:30 UTC —
    2009-10-01, 15:30 UTC —
    2009-10-01, 16:30 UTC —
    2009-10-01, 16:40 UTC —
    2009-10-01, 18:00 UTC —
    2009-10-02, 14:00 UTC —
    2009-10-02, 15:00 UTC —
    2009-10-03, 00:30 UTC —
    2009-10-04, 18:55 UTC —

    [Update 3 2009-10-06 8.28pm CET+1]



    First Nomination Sent— First Invitation Received (delay DD:HH:MM)
    2009-09-30, 16:30 UTC — 2009-10-01, 08:20 UTC (00:15:50)
    2009-09-30, 17:30 UTC — 2009-10-01, 04:20 UTC (00:10:50)
    2009-09-30, 20:43 UTC — 2009-10-01, 08:44 UTC (00:12:01)
    2009-10-01, 02:00 UTC — 2009-10-01, 23:30 UTC (00:21:30)
    2009-10-01, 03:00 UTC — 2009-10-01, 23:53 UTC (00:20:53)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:07 UTC (00:19:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 22:07 UTC (00:18:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:00 UTC (00:19:00)
    2009-10-01, 04:30 UTC — 2009-10-06, 01:31 UTC (4.9 days)
    2009-10-01, 05:10 UTC — 2009-10-06, 06:27 UTC (05:01:17)
    2009-10-01, 05:30 UTC — 2009-10-06, 07:00 UTC (05 days:01:30)
    2009-10-01, 06:35 UTC —
    2009-10-01, 06:45 UTC —
    2009-10-01, 06:59 UTC —2009-10-06, 07:44 UTC (05:00:45)
    2009-10-01, 07:00 UTC — 2009-10-06, 06:45 UTC (5 days)
    2009-10-01, 07:00 UTC — 2009-10-06, 07:00 UTC (5 days)
    2009-10-01, 07:15 UTC — 2009-10-06, 07:32 UTC (5 days)
    2009-10-01, 08:10 UTC — 2009-10-06. 05:56 UTC (04:21:46)
    2009-10-01, 09:00 UTC —
    2009-10-01, 10:00 UTC —
    2009-10-01, 11:45 UTC —
    2009-10-01, 13:20 UTC —
    2009-10-01, 13:30 UTC —
    2009-10-01, 15:30 UTC —
    2009-10-01, 16:30 UTC —
    2009-10-01, 16:40 UTC —
    2009-10-01, 18:00 UTC —
    2009-10-02, 14:00 UTC —
    2009-10-02, 15:00 UTC —
    2009-10-03, 00:30 UTC —
    2009-10-04, 18:55 UTC —
    2009-10-06, 10:00 UTC —
    2009-10-06, 12:55 UTC —


    -----

    [Update 2 2009-10-06]



    First Nomination Sent— First Invitation Received (delay DD:HH:MM)
    2009-09-30, 16:30 UTC — 2009-10-01, 08:20 UTC (00:15:50)
    2009-09-30, 17:30 UTC — 2009-10-01, 04:20 UTC (00:10:50)
    2009-09-30, 20:43 UTC — 2009-10-01, 08:44 UTC (00:12:01)
    2009-10-01, 02:00 UTC — 2009-10-01, 23:30 UTC (00:21:30)
    2009-10-01, 03:00 UTC — 2009-10-01, 23:53 UTC (00:20:53)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:07 UTC (00:19:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 22:07 UTC (00:18:07)
    2009-10-01, 04:00 UTC — 2009-10-01, 23:00 UTC (00:19:00)
    2009-10-01, 04:30 UTC —
    2009-10-01, 05:10 UTC — 2009-10-06, 06:27 UTC (05:01:17)
    2009-10-01, 05:30 UTC — 2009-10-06, 07:00 UTC (5 days)
    2009-10-01, 06:45 UTC —
    2009-10-01, 06:59 UTC —
    2009-10-01, 07:00 UTC — 2009-10-06, 06:45 UTC (5 days)
    2009-10-01, 07:00 UTC — 2009-10-06, 07:00 UTC (5 days)
    2009-10-01, 07:15 UTC — 2009-10-06, 07:32 UTC (5 days)
    2009-10-01, 09:00 UTC —
    2009-10-01, 10:00 UTC —
    2009-10-01, 11:45 UTC —
    2009-10-01, 13:20 UTC —
    2009-10-01, 13:30 UTC —
    2009-10-01, 15:30 UTC —
    2009-10-01, 16:30 UTC —
    2009-10-01, 16:40 UTC —
    2009-10-01, 18:00 UTC —
    2009-10-02, 14:00 UTC —
    2009-10-02, 15:00 UTC —
    2009-10-03, 00:30 UTC —
    2009-10-04, 18:55 UTC —

    [Update 2009-10-07]


    First Nomination Sent—First Invitation Received (delay DD:HH:MM)
    2009-09-30 16:30 UTC — 2009-10-01 08:20 UTC (00:15:50)
    2009-09-30 17:30 UTC — 2009-10-01 04:20 UTC (00:10:50)
    2009-09-30 20:43 UTC — 2009-10-01 08:44 UTC (00:12:01)
    2009-10-01 02:00 UTC — 2009-10-01 23:30 UTC (00:21:30)
    2009-10-01 04:00 UTC — 2009-10-01 23:07 UTC (00:19:07)
    2009-10-01 04:00 UTC — 2009-10-01 22:07 UTC (00:18:07)
    2009-10-01 04:00 UTC — 2009-10-01 23:00 UTC (00:19:00)
    2009-10-01 04:30 UTC — ?
    2009-10-01 05:10 UTC — ?
    2009-10-01 05:30 UTC — ?
    2009-10-01 06:45 UTC — ?
    2009-10-01 06:59 UTC — ?
    2009-10-01 07:00 UTC — ?
    2009-10-01 07:15 UTC — ?
    2009-10-01 08:00 UTC — 2009-10-07 04:49 UTC (05:20:49)
    2009-10-01 09:00 UTC — 2009-10-06 18:00 UTC (05:11:00)
    2009-10-01 09:00 UTC —
    2009-10-01 10:00 UTC — 2009-10-07 04:13 UTC (065:18:13?)
    2009-10-01 11:45 UTC —
    2009-10-01 12:00 UTC — 2009-10-07 06:30 UTC (05:18:30)
    2009-10-01 13:30 UTC —
    2009-10-01 16:30 UTC —
    2009-10-01 16:40 UTC —
    2009-10-01 18:00 UTC —
    2009-10-01 23:00 UTC —
    2009-10-02 15:00 UTC —
    2009-10-03 00:30 UTC —
    2009-10-04 18:55 UTC —

    [Update 2009-10-08]


    First Nomination Sent—First Invitation Received (delay DD:HH:MM)
    2009-09-30 16:30 UTC — 2009-10-01 08:20 UTC (00:15:50)
    2009-09-30 17:30 UTC — 2009-10-01 04:20 UTC (00:10:50)
    2009-09-30 20:43 UTC — 2009-10-01 08:44 UTC (00:12:01)
    2009-10-01 02:00 UTC — 2009-10-01 23:30 UTC (00:21:30)
    2009-10-01 04:00 UTC — 2009-10-01 23:07 UTC (00:19:07)
    2009-10-01 04:00 UTC — 2009-10-01 22:07 UTC (00:18:07)
    2009-10-01 04:00 UTC — 2009-10-01 23:00 UTC (00:19:00)
    2009-10-01 04:30 UTC — ?
    2009-10-01 05:10 UTC — ?
    2009-10-01 05:30 UTC — ?2009-10-06 07:00 UTC (05:01:30)
    2009-10-01 06:35 UTC — 2009-10-07 16:19 UTC (06:09:44)
    2009-10-01 06:45 UTC — ?
    2009-10-01 06:59 UTC — ?
    2009-10-01 07:00 UTC — ?
    2009-10-01 07:15 UTC — ?
    2009-10-01 08:00 UTC — 2009-10-07 04:49 UTC (05:20:49)
    2009-10-01 09:00 UTC — 2009-10-06 18:00 UTC (05:11:00)
    2009-10-01 09:00 UTC —
    2009-10-01 10:00 UTC — 2009-10-07 04:13 UTC (065:18:13?)
    2009-10-01 11:45 UTC —
    2009-10-01 12:00 UTC — 2009-10-07 06:30 UTC (05:18:30)
    2009-10-01 13:30 UTC — 2009-10-07 04:55 UTC (05:15:25)
    2009-10-01 16:30 UTC —
    2009-10-01 16:40 UTC —
    2009-10-01 18:00 UTC —
    2009-10-01 23:00 UTC —
    2009-10-02 15:00 UTC —
    2009-10-03 00:30 UTC —
    2009-10-04 18:55 UTC —

    -----

    [Update 2009-10-09]


    2009-09-30 16:30 UTC — 2009-10-01 08:20 UTC (00:15:50)
    2009-09-30 17:30 UTC — 2009-10-01 04:20 UTC (00:10:50)
    2009-09-30 20:43 UTC — 2009-10-01 08:44 UTC (00:12:01)
    2009-10-01 02:00 UTC — 2009-10-01 23:30 UTC (00:21:30)
    2009-10-01 04:00 UTC — 2009-10-01 23:07 UTC (00:19:07)
    2009-10-01 04:00 UTC — 2009-10-01 22:07 UTC (00:18:07)
    2009-10-01 04:00 UTC — 2009-10-01 23:00 UTC (00:19:00)
    2009-10-01 04:30 UTC — ?

    2009-10-01 05:10 UTC — ?2009-10-06 05:33 UTC (05:00:23)
    2009-10-01 05:30 UTC — 2009-10-06 07:00 UTC (05:01:30)
    2009-10-01 06:35 UTC — 2009-10-07 16:19 UTC (06:09:44)
    2009-10-01 06:45 UTC — ?
    2009-10-01 06:59 UTC — ?
    2009-10-01 07:00 UTC — ?TC — ?
    2009-10-01 07:15 UTC — ?
    2009-10-01 08:00 UTC — 2009-10-07 046:49 UTC (05:2018:49)
    2009-10-01 09:00 UTC — 2009-10-06 18:00 UTC (05:11:00)
    2009-10-01 09:00 UTC —
    2009-10-01 10:00 UTC — 2009-10-07 04:13 UTC (05:18:13)
    2009-10-01 10:?? UTC — 2009-10-08 ??:?? UTC (07:??:??)
    2009-10-01 11:45 UTC —
    2009-10-01 12:00 UTC — 2009-10-07 06:30 UTC (05:18:30)
    2009-10-01 13:30 UTC — 2009-10-07 04:44 UTC (05:15:15)
    2009-10-01 13:30 UTC — 2009-10-07 04:55 UTC (05:15:25)
    2009-10-01 14:30 UTC — 2009-10-09 04:00 UTC (07:13:30)
    2009-10-01 16:00 UTC — 2009-10-09 01:30 UTC (07:09:30)
    2009-10-01 16:30 UTC —
    2009-10-01 16:40 UTC — 2009-10-08 22:50 UTC (07:06:10)
    2009-10-01 18:00 UTC —

    2009-10-01 19:30 UTC — 2009-10-09 01:17 UTC
    2009-10-01 21:00 UTC — 2009-10-09 00:55 UTC (07:03:55)
    2009-10-01 23:00 UTC — 2009-10-08 23:25 UTC (07:00:25)

    2009-10-02 15:00 UTC —
    2009-10-02 21:00 UTC — 2009-10-09 01:25 UTC
    2009-10-02 06:30 UTC ---
    2009-10-03 00:30 UTC —
    2009-10-04 18:55 UTC —
    ----------

    [Update 2009-10-11]


    First Nomination Sent—First Invitation Received (delay DD:HH:MM)
    2009-09-30 16:30 UTC — 2009-10-01 08:20 UTC (00:15:50)
    2009-09-30 17:30 UTC — 2009-10-01 04:20 UTC (00:10:50)
    2009-09-30 20:43 UTC — 2009-10-01 08:44 UTC (00:12:01)
    2009-10-01 02:00 UTC — 2009-10-01 23:30 UTC (00:21:30)
    2009-10-01 04:00 UTC — 2009-10-01 23:07 UTC (00:19:07)
    2009-10-01 04:00 UTC — 2009-10-01 22:07 UTC (00:18:07)
    2009-10-01 04:00 UTC — 2009-10-01 23:00 UTC (00:19:00)
    2009-10-01 04:30 UTC — ?
    2009-10-01 05:10 UTC — 2009-10-06 05:33 UTC (05:00:23)
    2009-10-01 05:30 UTC — 2009-10-06 07:00 UTC (05:01:30)
    2009-10-01 06:35 UTC — 2009-10-07 16:19 UTC (06:09:44)
    2009-10-01 06:45 UTC — ?
    2009-10-01 06:59 UTC — ?
    2009-10-01 07:00 UTC — ?
    2009-10-01 07:15 UTC — ?
    2009-10-01 08:00 UTC — 2009-10-07 06:49 UTC (05:18:49)
    2009-10-01 09:00 UTC — 2009-10-06 18:00 UTC (05:11:00)
    2009-10-01 09:00 UTC —
    2009-10-01 10:00 UTC — 2009-10-07 04:13 UTC (05:18:13)
    2009-10-01 10:?? UTC — 2009-10-08 ??:?? UTC (07:??:??)
    2009-10-01 11:45 UTC —
    2009-10-01 12:00 UTC — 2009-10-07 06:30 UTC (05:18:30)
    2009-10-01 13:30 UTC — 2009-10-07 04:44 UTC (05:15:15)
    2009-10-01 13:30 UTC — 2009-10-07 04:55 UTC (05:15:25)
    2009-10-01 14:30 UTC — 2009-10-09 04:00 UTC (07:13:30)
    2009-10-01 16:00 UTC — 2009-10-09 01:30 UTC (07:09:30)
    2009-10-01 16:30 UTC —
    2009-10-01 16:40 UTC — 2009-10-08 22:50 UTC (07:06:10)
    2009-10-01 18:00 UTC — 2009-10-09 01:05 UTC
    2009-10-01 19:30 UTC — 2009-10-09 01:17 UTC
    2009-10-01 20:45 UTC — 2009-10-09 01:44 UTC (07:05:00)
    2009-10-01 21:00 UTC — 2009-10-09 00:55 UTC (07:03:55)
    2009-10-01 23:00 UTC — 2009-10-08 23:25 UTC (07:00:25)
    2009-10-02 15:00 UTC — 2009-10-10 08:00 UTC
    2009-10-02 15:30 UTC — 2009-10-11 14:30 UTC (08:23:00)
    2009-10-02 21:00 UTC — 2009-10-09 01:25 UTC
    2009-10-02 06:30 UTC —
    2009-10-03 00:30 UTC — 2009-10-11 01:40 UTC (08:01:10)
    2009-10-03 04:45 UTC — 2009-10-11 00:45 UTC (08:20:00)
    2009-10-04 18:55 UTC —
    2009-10-07 16:44 UTC — ?

    ------------


    Note that this list is updated and maintained manually by people who want to share information, so I take no responsibility of the accuracy or completeness of the information in it. It does look like something hit the fan last Thursday which made everything stop invite-wise. My guess is that when whatever it is they're doing is finished, invites will start to appear again.

    I'll update this post whenever I get new info on the status of Wave invites.

    Cheers,
    PS