document.write('
    \x0a \x0a \x0a
  1. \x0a \x0a
    An argument against the "Add-On" lifestyle.
    \x0a \x0a \x0a
    \x0a

    I hear this argument a lot:

    \x0a
      \x0a
    • “Oh no. I don’t want to use this really helpful software utility because I’ll end up depending on it and wouldn’t be able to use somebody else’s computer ever thereafter”.
    • \x0a
    \x0a

    Isn’t that like saying:

    \x0a
      \x0a
    • “Oh no. I don’t want to use this really helpful hammer thingy because I’d end up depending on it and wouldn’t be able to use somebody else’s rocks ever thereafter”
    • \x0a
    \x0a

    And my opinion is that this doesn’t make sense to me, so whenever I encounter this argument, I assume it really means ”I don’t want to learn yet another tool even though it promises to make the first tool easier”.

    \x0a
    \x0a
  2. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a\x0a \x0a\x0a \x0a
  3. \x0a
    \x0a Programmers… often take refuge in an understandable, but disastrous, inclination towards complexity and ingenuity in their work. Forbidden to design anything larger than a program, they respond by making that program intricate enough to challenge their professional skill.\x0a
    \x0a \x0a \x0a
    \x0a Principles of Program Design (1975), Michael A. Jackson\x0a
    \x0a \x0a
  4. \x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a
  5. \x0a \x0a
    Code Monkey but mostly Architecture.
    \x0a \x0a \x0a
    \x0a

    Been thinking about my way into the art of programming.

    Way back when I’d just come of GW-Basic and before that, the Commodore 64 Basic, I was very line number oriented. I used goto’s and knew nothing about Edsger Dijkstra’s influential 1968 paper “Go To Statement Considered Harmful”.

    I dabbled in Turbo Pascal and I used QBasic but was too locked into the idea of line numbers. A friend sorta had to push me to start thinking in subroutines. Later, in the interim between high school and further study, I looked at C. C++ opened my eyes to object orientation. VBScript was awful and Javascript highly frustrating because of browser oddities. I could never remember how to do stuff in Perl. Assembly sank my boat and made me cry.

    It wasn’t until I started writing Java that I began to think about abstraction and discovering GoF Design Patterns challenged me to go further. Tapestry 3 began my way into component orientation and ASP.NET made me dump the Struts controller completely-never-to-go-back.

    ASP.NET made events easy and likeable for me because of their first-class citizenship in C#. Though it took a few false starts before I found out how to use them without excessive FindControl this and thats.

    Then it got popular to learn LISP which I sorta kinda did. I looked at the language but I first learned about the “Code as Data” concept from blog posts by Howard (of Tapestry fame).

    ESBs introduced me to message based systems. Something that’s probably been popular for ages but which to me, still seems like only being worth it in large systems with tough demands on scalability.

    \x0a

    I began using dependency injection with Tapestry 4 and became a fan of the decoupled design and external interface-class configuration though I hated the XML. Guice hit the nail on the head for me while Spring still seems like XML hell.

    \x0a

    Dynamic languages are sorta kewl but scary.  I haven’t made the transition. Python doesn’t feel right for me but I haven’t use it much. The new ‘var’ keyword in .NET 3.5 C# seems more conservative and I could get use to that. In spite of all the buzz and excitement, I can’t see a place for this dynamic stuff in real-world projects with budgets and deadlines. I have yet to try one.

    All this makes me wonder how the future will change my current favorites of using dependency injection, code-as-data, events and component orientation.

    \x0a
    \x0a
  6. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a\x0a \x0a\x0a \x0a
  7. \x0a
    \x0a You gotta get into subs [subroutines], man!\x0a
    \x0a \x0a \x0a
    \x0a Grant Sinclair, Keebra Park co-student, circa 1993 outside math block.\x0a
    \x0a \x0a
  8. \x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a
  9. \x0a \x0a
    A new year.
    \x0a \x0a \x0a
    \x0a

    Quotes and ideas to live by until better ones are found.

    “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”
    - Martin Fowler

    \x0a

    KISS principle: Keep it Simple, Stupid.

    \x0a

    “Good judgement comes from experience, and experience comes from bad judgement.”
    - Fred Brooks

    \x0a

    “Do not take life too seriously. You will never get out of it alive.”
    - Elbert Hubbard

    \x0a

    Fail-fast principle

    \x0a

    “Learning is not compulsory. Neither is survival.”
    - W. Edwards Deming

    \x0a

    DRY principle: Don’t repeat yourself.

    \x0a

    “The important thing is not to stop questioning.”
    - Albert Einstein

    \x0a

    The Project Management Triangle: Fast, Good or Cheap. You may only pick two.

    \x0a
    \x0a
  10. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a
  11. \x0a \x0a
    Sick
    \x0a \x0a \x0a
    \x0a

    I’m ill with the flu. This always messes up my sleep pattern, as well as giving me odd food cravings like what I’m eating now, at 5am, which is .. a can of chopped pineapple that’s been sitting in a kitchen cabinet for the last year. I’m always surprised by the expiration date on those things.

    Anyway, on to the point of this text. Audiobooks are great. I usually listen during my 45 minute commute to save the stress on my sleep deprived / overworked eyes.

    While I’ve been ill with the killer flu of Satan, I’ve listened to “Douglas Adams at the BBC” and I am absolutely awestruck. I was already a huge fan of the Hitchhikers Guide to the Galaxy and to a lesser degree, Dirk Gently and I thought that was all that he had ever done. But no, he was also a computer and Internet visionary and into protecting endangered species. The book doesn’t read like the usual narrator kind. Rather, the host sets up a series of comedy sketch plays and interviews with the people that worked with Douglas Adams over the years. It’s a definite must-consume for biography fans.

    Another book “How to Survive a Robot Uprising” was less good. I’d heard an interview with the author and thought it’d be better but it ended up putting me to sleep earlier. The humour was pushed too hard for some of the advice on how to escape killer robots eg. why would your Roomba vacuum robot and digital home ever need robot arms?! While it is a geek book, I think it’s less of a must-consume. Personally, I have a tendency to weigh the plausibility of things. This has ruined many movies and I’m clearly at fault. Can’t help it though.

    Done with the pineapple. Now, what else can I eat?

    \x0a
    \x0a
  12. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a
  13. \x0a \x0a
    Unleash my iPod
    \x0a \x0a \x0a
    \x0a

    Apple didn’t want to host the Podcaster application in their App Store. Their reason was that it duplicates functionality already present in iTunes.

    No, it doesn’t and I’ll tell you why. I’ve had the same old podcasts on my iPod Touch for a week now. This was not the case when my iPod was JailBroken and I used the MobileCast application to wirelessly download podcasts over any open WIFI.

    I need my iPod to stand alone because I’m just not plugging it into iTunes everyday. Needing a computer to update an iPod doesn’t make sense to me, so I don’t do it.

    Since I upgraded to 2.1, I haven’t been able to JailBreak my iPod due to some 600x error and I really miss that MobileCast application.

    \x0a
    \x0a
  14. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a
  15. \x0a \x0a
    Too much automation hurts.
    \x0a \x0a \x0a
    \x0a

    I just recieved an automated email answering a question that I had about a failed payment. The answer does not address anything relating to my question at all. Now THAT’s a good way to anger your customers.

    I experienced what I consider the most annoying error on the internet: a failed payment transaction. I’ve been waiting for Spore for years and while I’m against all that includes DRM, I had to make an exception in this case.

    So I loaded up the EA shop and found that the Mac version is only available for immediate download through some Canadian shop. I proceeded to pay and found that it was handled by WorldPay.com. It was all as I expected until WorldPay decided to send a browser redirect while checking my card details.

    Firefox 3 introduced an odd feature that halts a redirect from happening. I’m not sure if it’s part of an effort to thwart phishing sites but in my case, it thwarted my attempt to pay for Spore. It simply broke the WorldPay payment flow.

    Having a payment transaction fail is always accompanied by fear. And while I’m feeling the fear of having lost my money into the great void of /dev/null, I fully expect the responsible company to respond to this “lost my monies, yes/no” question. It’s okay if it takes 2-4 days. It is NOT okay to get an automated answer that isn’t even about my question.

    Bad bad bad WorldPay.com.

    \x0a
    \x0a
  16. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a
  17. \x0a \x0a
    Annoyances
    \x0a \x0a \x0a
    \x0a

    An incomplete list of technology “issues” that annoys me.

    Microsoft Silverlight == Sun Applets.
    Won’t fly. Applets proved this. Sure WPF is pretty but apps still don’t integrate browser functions such as print. Microsoft marketing makes me nauseous.

    Synchronization.
    I want my mobile devices to pull data directly from online servers. This includes email, calendar etc. It also includes podcast downloads. I do _not_ want to use my computer as a transit device.

    Media sharing.
    Sharing media is still a pain. Codecs, transport formats and DRM screws everything up. Even the lowest denominator of file formats has internal variances that some devices can’t stomach.

    Bad software translations.
    I loathe bad software translations. What makes my toes cringe and blood pressure rise is usually word(s) used in the wrong context. Furthermore, having companies assume that I speak swedish, norwegian or german just because of geographical proximity to those countries is offensive. If I can’t have a _good_ danish translation then I’d much rather settle for the english version.

    \x0a
    \x0a
  18. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a \x0a
  19. \x0a \x0a
    Bleeding abstractions in .Net.
    \x0a \x0a \x0a
    \x0a

    Building a software architecture on the idea of dependency injection demands that each distinct feature is defined by an interface. One advantage of this is decoupled code where a part can be swapped out without a major refactor. I’m definitely a huge fan of this idea.

    But in order for this code swapping to work, any implementation of an interface must only exhibit behavior defined by that interface. An example of a bleeding abstraction is if an implementation throws an exception that isn’t defined in the interface.

    Recently, I found a major difference between .Net and Java that I hadn’t thought about before. It’s all to do with exceptions being unchecked in .Net.

    .Net contains only unchecked exceptions which means that there is no way of defining these in an interface. This makes all exceptions specific to a given implementation.

    So, if you insist on letting exceptions bubble out of your implementations then your interface abstractions are bleeding. This is bad because you need detailed knowledge of the implementation in order to use the interface. The worst case of ignoring this is 5 unhandled exceptions bubbling to the top within 5 mintutes and thereby shutting down your IIS web application.

    But ignoring this detailed knowledge is exactly the point of dependency injection and if you’re going to do it right then you can’t use exceptions for error reporting.

    Loosing the exception system when designing features is a big loss. The akwardness can be seen in MembershipProvider.CreateUser which uses an enum to report failures. While this is a tad better than returning raw integer values, it isn’t much better. There’s no stack trace to help debugging unexpected causes either.

    Sure, I know exceptions are expensive to create and they should only be used for unexpected errors but using an enum out parameter for error reporting is a step way backwards to early C programming days.

    So, my conclusion is that exceptions are out if you’re building dependency injection powered application in .Net. I feel pretty bummed out by this realization.

    \x0a
    \x0a
  20. \x0a \x0a\x0a \x0a\x0a \x0a\x0a \x0a \x0a \x0a \x0a \x0a\x0a \x0a \x0a
');