Visual Studio 11 crashes with InvalidCastException

UPDATE: This issue can be solved by running the steps described here. There’s also a Microsoft Connect ticket describing the problem.

Just got Visual Studio 11 beta (with recent VS March Update) to crash consistently on start-up:

Launch VS, immediate crash:

Debugging that brings up the following exception:

The exception detail reads:

System.InvalidCastException was unhandled
Message=Unable to cast COM object of type ‘System.__ComObject’ to interface type ‘Microsoft.VisualStudio.OLE.Interop.IServiceProvider’. This operation failed because the QueryInterface call on the COM component for the interface with IID ‘{6D5140C1-7436-11CE-8034-00AA006009FA}’ failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
at Microsoft.VisualStudio.OLE.Interop.IServiceProvider.QueryService(Guid& guidService, Guid& riid, IntPtr& ppvObject)
at Microsoft.VisualStudio.Shell.ServiceProvider.QueryService(Guid guid, Type serviceType, Object& service)
at Microsoft.VisualStudio.Shell.ServiceProvider.QueryService(Type serviceType, Object& service)
at Microsoft.VisualStudio.Shell.ThreadHelper.get_Invoker()
at Microsoft.VisualStudio.Shell.ThreadHelper.InvokeOnUIThread(InvokableBase invokable)
at Microsoft.VisualStudio.Shell.ThreadHelper.Invoke(Action action)
at Microsoft.VisualStudio.Services.TaskSchedulerService.VsUIThreadScheduler.<>c__DisplayClass2.<QueueTask>b__0(Object _)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

How did I get in this state? I’m unsure, but I think I accidentally hit F1 key. (Oh noes, the dreaded Visual Studio F1 key!) Somehow, I think that wired up the VS help, which resulted in a consistent crash at boot.

Running devenv.exe /resetskippkgs didn’t fix it. Running a full VS repair doesn’t fix it.

Anyone else hitting this issue?

5:01 developers are visionless hacks

The 501 Manifesto states that:

  • Our families are more important than the commercial goals of business owners
  • Free time is more important than free snacks
  • Living our lives is more important than maintaining our personal brands
  • Sustainable pace is more important than muscle-man heroics
  • Our personal creative projects are more important than commercial products the world doesn’t need
  • Having money for nice clothes is more important than getting free t-shirts from Microsoft
  • Playing fußball in the pub with our friends is more important than playing fußball in the office with our team leader
  • Not being a dick is more important than being a rockstar

“501” refers to programmers who punch out at 5:01pm and never think about technology until 9am the next morning. They don’t read programming blogs or books, nor do they have a desire to advance their craft. Technology is nothing special to them, software is just another job. They might as well be bagging groceries if the pay was comparable.

There’s some good to be gleaned from this manifesto. If your software job is all you do, your life will pass you by and you’ll wonder why you spent so much of your life living for a corporation. You’ll realize what a waste of a life it is to make all that money but not, you know, live. The young & ambitious tend to overlook this wisdom.

Having a life outside of tech is important and rewarding. For me, I play music, I help run a religious congregation, I spend time with my kids and my wife. Those things are hugely rewarding.

I sympathize with the 501 manifesto, but there’s something not quite right here.

The manifesto confuses corporate interference into personal life with passion for technology. That is to say, it incorrectly implies the people who are passionate about technology are those enslaved to their corporate masters. It makes this confusion when it says those who “write technical blogs, attend user groups, or contribute to open source projects” are those who are enslaved by their corporate masters.

It’s silly, because my corporation didn’t ask me to write this blog, attend Code Camp last week, go to user groups, or contribute to open source projects. In fact, many corporations frown on such things, since it takes time away from working on The Project. My corporate masters didn’t ask me to do those things, nor did I do those things in order to impress my corporate masters.

Instead, I do these things because I love technology. And I suspect those of you who do these things do so because, like me, you’re passionate about software and technology, not because some evil corporation forced your hand.

I entered technology because it’s my passion. I take joy in writing software, and in a bigger sense, I consider technology a frontier for humanity and the advancer of civilization. More on that in a minute.

If you entered the technology field for other reasons like money or easy labor, I suggest finding a career you are passionate about. It’s hard to put a price on happiness, and if you aren’t happy with your choice of career, get out before you waste any more of your life on it.

Why be passionate about technology?

I find it freakin’ awesome that we can make new things. We’re in a new age, an age of technology, and we’re the inventors at the fore. We build things from scratch! Then put those new things in front of people. And some of those things might be so useful, that people will use those things regularly. What a rare and precious opportunity we have, that we can build and invent new things, things that can impact humanity.

Hubris? Not at all:

We explore the universe because of technology.

We fix sick people because of technology.

We can communicate with anyone in the world via the push of a button because of technology.

We prevent disease because of technology.

We have the sum total of humanity’s knowledge in a single repository — the internet — because of technology. That we have a single repository containing the sum of human knowledge for the first time in our history is an accomplishment in itself, but just wait until you see the ramifications of this knowledge freely available to all. It will result in an explosion of learning, new technology, new ideas; raw civilization advancement.

I want to be part of that. It’s why I have a passion for technology. It’s why I don’t consider software, the brains behind technology, just another job. I don’t stop thinking about it at 5:01pm. Technology is a frontier for humanity. And I’m going to add to it, even if through some insignificantly small contribution.

Shortsighted and visionless is the person who looks at software as just another job, technology as just another field. If that’s you, find a job you take joy in, and in a field you are passionate about. Your life will be happier.

For the rest of us, the 21st century is a great time to be alive. We, the technologists, are the new inventors. We are the future, and the future, my friends, is bright. Watch and see.

Nerds, Code Camps, and You

Summary: Reflections on Twin Cities Code Camp 12, and my talk on the death of Silverlight and the triumph of HTML5. Why code camps and developer user groups are great for the happiness and careers of all who love technology.

This past weekend marked the 3rd Twin Cities Code Camp conference I’ve attended. Each year gets better.

Why are code camps so great?

You get to hang with nerdy people. That’s me in the blue shirt:portrait of me and another nerd at Code Camp

…You get to talk nerd crap with other nerds:

Cats (both LOL and Nyan variety)? Llamas? Star Wars? Sailor Moon? The nerdliness abounds:

…You get to give fun/silly talks. I spent a good 30 minutes talking serious about the death of web plugins and the triumph of HTML5, but ended with a from-scratch demo building an HTML5 radio station that played…llama music. Oh yes!

I rocked that talk hard, and had a blast doing so:

Doesn’t hurt to hear great feedback:

Oh yeah!

Code Camps are total nerd fests, and it’s a blast. You learn tech, you grow your career, you have fun.

If you’re a dev who loves software and technology, step outside your job and have some fun with technology. Try a Code Camp, or even just a local user group. Self-improve and have fun while doing it. Good for career, good for life happiness.

Move Your Silverlight Skills to the Web with KnockoutJS

Summary: Posted the slides for my recent, unconventional talk, “Move Your Silverlight Skills to the Web with KnockoutJS.” And a note about web plug-ins like Flash and Silverlight.

I spoke at the Twin Cities Silverlight User Group yesterday afternoon on a rather uncomfortable topic: Silverlight’s imminent irrelevance. I told Silverlight developers they should stop writing Silverlight code and move to the native web.  🙂 It definitely raised some eyebrows.

Fortunately, they didn’t throw rotten fruit at me; we actually had some great discussion back and forth about the software industry, Silverlight, and the future of the web. Overall, it was a blast! You can view my Rage Comic-infused slides online: Move Your Silverlight Skills to the Web with KnockoutJS

So why should Silverlight developers think about moving their skills to the web? See my earlier post, The Bell Tolls for Flash, and Silverlight Isn’t Far Behind. In a nutshell, we are witnessing in our industry a major shift away from web plugin technology like Flash, Silverlight, and JavaFX. With the explosion of mobile computing, I believe this trend will grow, such  that the only real platform for the web is the native web technologies: HTML, JavaScript, CSS.

If you’re a Silverlight dev, it’s time to move on. The war’s over and, for better or worse, web plugins lost. The native web is where it’s at.

Opened web FTW! How I used opened web APIs and standards to build a beautiful HTML5 web app

Summary: It’s a great time to be a web developer. HTML5, KnockoutJS, MVC3, RavenDB, and opened web APIs and services like Google Docs, IfThisThenThat, and RSS are combined to build a beautiful, useful web app. The opened web is coming to fruition.

I recently released, an HTML 5 site for finding lyrics and guitar chords to Messianic Jewish religious music.

Using opened web APIs to build this thing proved effective. Do web developers know these APIs exist? They should; these opened web APIs and standards are powerful tools that will make your app shine.

The raison d’etra of MessianicChords is to provide a way to find lyrics and guitar chords to Messianic Jewish music. This sounds simple, but building it presented a number of challenges:

  • Precise character formatting required. Guitar chords sheets require precise formatting; the G chord must be precisely above the “Let us exalt” line, for example.  This makes automatic conversion to straight HTML unfeasible. This lack of formatting preservation has plagued existing guitar chord sites like
  • Proprietary file formats. Guitar chord sheets are often in .doc or .pdf formats due to precise formatting requirements, as well as for historical reasons. This is problematic, because I wanted the chord sheets to be viewable on all devices and platforms, especially tablets like iPad, seeing as how many artists and guitarists use tablets to view the chords while playing music.
  • Searching. I wanted to be able to type a title, artist, or even a partial lyric, and have results come back instantly. Today, users have come to expect Google-like instant search results. In reality, it’s very difficult to make search work like Google: partial matches, incomplete search terms, search qualifiers (such as placing quotes around a group of words) — these all present additional technical challenges.
  • Letting users upload content. While myself and a few contributors have created a large library of Messianic Jewish music chord sheets, approximately several hundred chord sheets, letting the community add chord sheets was important.
  • Automated announcement of new chord sheets. When new chord sheets are added, we’d like to announce it to the world. Better yet, make it automated.
  • An interactive, clean HTML5 app. The existing chords and lyrics sites are littered with ads, have a messy navigation system, and look as though they were designed in the 1990s. Can we do better?

Getting complex, proprietary documents onto the opened web

The formatting issue was the most important to tackle: how can we take complex documents of proprietary file formats and make them available on the opened web?

Enter Google Docs. With Google Docs, you can upload documents, including .doc and .pdf formats, and view them right in your web browser without having to install any special software or plugins. Google’s servers do the heavy lifting on the back end, and you with your web browser reap the fruit.

Additionally, Google provides a sharing model for documents on Google Docs: you can share the document with individuals (specified by email address), you can make the document semi-public by generating a link to the document, or you can make the document entirely public, discoverable by search engines and the like. For MessianicChords, I chose the latter: documents that are public, discoverable by search engines, with a public URL. In addition to sharing, docs can have multiple authors and collaborators. For MessianicChords, I made the chord sheets visible on the web, but read-only to the general public, editable only by myself and some trusted admins.

Finally, and most importantly, Google Docs comes with a powerful API to find documents, metadata, and grab URLs to them. For MessianicChords, having chose ASP.NET MVC3 on the server, there’s a free .NET wrapper for the Google Docs APIs, available as a NuGet package.

With Google Docs, it allowed me to preserve the special formatting of guitar chord sheets, while still making them available on the web. With the Google Docs API, I was able to use Google Docs as a kind of database for the chord sheets. It solved the proprietary file format problem not by lossy conversion, as so many other chord sites do, but by making them viewable via pure HTML/JS.


Users have come to expect Google-like search capabilities: instant, partial search terms, close matches, special search terms such as words grouped in quotes, and so on.

With Google Docs as our pseudo-database for chord sheets, I get the best of the search world: Google’s own search algorithms via the Google Docs API. Send over a query with bless God should return all documents with the word bless and God in them; many results. However, if you search for that same phrase, but in quotes, “bless God”, you get only documents that contain that exact phrase.

Best of all, the performance of these queries is excellent: near instant, under a second.

Using Google Docs as a storage mechanism for MessianicChords results in a free, web-accessible database with built-in Google search functionality. Win.

User-generated content and automating the “tell the world about it” part

Since MessianicChords allows users to contribute their own chord sheets, wouldn’t it be nice if we could announce to the world new chord sheets as they’re added?

Sure, I could send out an email, but email blasts are so 1990.

And yeah, I could put an announcement on the Facebook fan page, but Facebook is ultimately a walled garden that will eventually pass away.

Keeping with our spirit of living on the opened web, can we do some sort of announcement of new content that lives on the opened web?

Enter RSS. This is a long-standing, UI-agnostic technology that keeps track of updates to blogs, news sites, or other content that is frequently updated. Boiled down, it’s just an XML file that describes the what, who, and when of updates in a standardized way. The result can be consumed in any RSS aggregator, such as Google Reader.

For MessianicChords, I wanted to publish an RSS feed of new chord sheets. This way, updates to the website are broadcast in a standardized way on the opened web, not limited to Facebook walled gardens, private email inboxes, or proprietary services like Twitter. (Though we can push to those services if we please. More on that later.)

So, the first problem: we need to persistently store the list of updated documents. I could probably have used Google Docs for this, too, but it felt right to have a real database here to keep track of purely application-level things. For this, I used RavenDB Embedded. RavenDB is an open source document database. It’s a great, free database for .NET development, and the embedded version can run inside web apps without any special machine configuration or installation. I plopped that sucker right into my web app, following the lead from the excellent MSDN article, Embedding RavenDB into an MVC3 app.

Within 5 minutes, I was up and running with RavenDB, storing the user’s uploaded chord sheets as records in Raven.

With the upload records in place,  how do you generate an RSS feed from ASP.NET MVC3?

Turns out, it’s a piece of cake, thanks in part to Microsoft’s Windows Communication Foundation (WCF) APIs, in particular, the SyndicationFeedFormatter class.

We’re looking to have a URL where the updates feed resides. For this, you can create a custom MVC ActionResult that wraps up an RSS feed.

public class FeedResult : ActionResult
    public Encoding ContentEncoding { get; set; }
    public string ContentType { get; set; }

    private readonly SyndicationFeedFormatter feed;
    public SyndicationFeedFormatter Feed
        get { return feed; }

    public FeedResult(SyndicationFeedFormatter feed)
        this.feed = feed;

    public override void ExecuteResult(ControllerContext context) {
        if (context == null)
            throw new ArgumentNullException("context");

        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/rss+xml";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        if (feed != null)
            using (var xmlWriter = new XmlTextWriter(response.Output))
                xmlWriter.Formatting = Formatting.Indented;

This gives us an ActionResult we can then return from an MVC3 action to render an RSS feed. From there, we return an instance of this class, populating it with the upload records stored in RavenDB. End result? See it in action: As you can see, each upload record shows up in the RSS feed, as populated from Raven.

Wooohooo! We now have an RSS feed for user-generated content.

Pushing RSS to proprietary services like Facebook and Twitter

Is RSS enough? How many people know what RSS is, let alone know how to subscribe to it? Sadly, the current state of the web and web browsers makes it awkward at best to subscribe to an RSS feed.

How can we get our nice, standards-compliant, opened web feed of updates to regular, non-techie people?

Enter IfThisThenThat. In a nutshell, this is a free service that puts the web to work for you. In more concrete terms, it lets you listen for actions on the web — a new blog post, an RSS feed updated, a Tweet posted, a Facebook image tagged, whatever you can imagine — and then do some other action in response to that trigger. If [this], then do [that]. Scott Hanselman has a great write-up on the technology.

For MessianicChords, I decided my “this“, that is, my trigger, would be “when the MessianicChords RSS feed is updated”. And my “that“, which is my reaction to the trigger, would be, “Post a new Tweet announcing the new chord sheet.” It looks like this:

I also set up a trigger to announce the new chord sheet to Facebook. Also, to direct message my main Twitter account with the news, so that myself or other admins will quickly send it through the approval process.

Bottom line: we used the If This Then That cloud service to consume our “user uploads” RSS feed, then automatically tweet the news of the new user-generated content and spread it around the social networks. Awesome!

Interactive, clean HTML 5

Last but certainly not least, an important part of all this is the user experience. I want to differentiate my site from other chord sites by having zero ads, and a clean, responsive UI.

Yes, when search results come in, I want a subtle fade-in effect.

Yes, I want nice prompt text that disappears as you enter the textbox.

Yes, I want an inline upload functionality that doesn’t navigate away from the page or your current task.

Yes, I want each search to have its own URL.

Yes, I want search results to appear as I type. But if I type too fast, it should wait a moment before trying to search.

Yes, I want the whole thing to feel smooth and elegant.

While these things can be accomplished “manually”, as it were, with jQuery and straight DOM manipulation, this whole thing would become rather unwieldy.

Enter KnockoutJS. Knockout is a client-side library that makes it easy to build interactive web apps. It accomplishes this through data-binding and the MVVM pattern that separates your UI from your logic. Instead of a mash of UI DOM manipulation and logic in your JS code, with Knockout, you can write apps where your JS code free from DOM manipulation. Your code is cleaner — focused only on logic — allowing you to focus on doing awesome things in your UI.

For MessianicChords, I used data-binding to show the results of the search. My HTML looks like this:

<div class="search-results-container" data-bind="foreach: searchResults>
      <a data-bind="text: Name, attr: { href: DocumentUrl }" />

So simple! Our JS, then, creates an array called searchResults, populates it at runtime. When it gets populated, Knockout renders a template for every item in searchResults array. The search results come back with objects containing a Name, a DocumentURL, and those get rendered inside our search-results-container as shown. Awesome!

How about things like automatically searching when we type? And only searching if the typing has been idle for awhile? Knockout to the rescue again:

<input data-bind="value: searchText, valueUpdate: 'keydown'" />

And in our JavaScript:

var searchResults = ko.observableArray();
var searchText = ko.observable();
var searchTextThrottled = ko.computed(function() { return searchText(); }).extend({ throttle: 250 });
searchTextThrottled.subscribe(function(newSearchText) {
   // perform AJAX to MVC action to fetch search results from Google Docs
   $.getJSON("/Home/Search", { searchTerm: newSearchText }).success(function(results) {

As soon as we push results into our searchResults array, Knockout automatically renders the search results onto the page, thanks to data-binding. Sweet!

And notice how we subscribed to the throttled value of the search text. The searchText observable is updated as the user types, then the searchTextThrottled value waits for a no-typing period of 250ms before sending the query to the server. Complex UI interaction pattern, but took just 3 or 4 lines of JS code to accomplish, thanks Knockout.

Bottom line: KnockoutJS gave us the ability to write an interactive UI with ease.

Summary: It’s a great time to be a web developer!

The web is evolving and getting better. The technologies now available to us as web developers is staggering; tools like HTML5, KnockoutJS, Modernizr, RSS make it easy to build web apps that shine. And  external services like IfThisThenThat, RSS, and Google Docs, makes building services that integrate with the opened web a piece of cake.

These opened web APIs grant web developers powerful capabilities not in previous generations. The opened web is coming to fruition, and we’re reaping the benefits.

Web dev for the win.

How to partially solve the blogs-are-dying problem: comments

One of the reasons that blogs are dying is that blogs no longer represent an individual online. Instead, Twitter, Facebook, or even email represents a person online. Blogs are relegated as unimportant side shows.

One problem with this — and forgive my verbing a noun — is that it silos a person into a single commercial entity. If your Facebook profile is you, no one can know about you except your Facebook friends. The only people than come in and go out are Facebook users. That’s a problem, because if Facebook ever becomes passe — not unlike MySpace did in recent memory — your identity online is scrapped.

So what other options do we have, and how can we make blogging relevant again?

Respected technologist Dave Winer recently posited that, on the net, your feed is you. What is your feed? I’d broaden Winer’s definition and say, it’s all the public stuff you do on the web: your blog posts. Your tweets. Your Facebook comments and status. Your comments on other blog posts. All of it.

That’s you. On the web, you are your feed. 

The important part is the content you write, which is ultimately your blog. Everything else is secondary; Twitter can be an announcement mechanism for your blog posts. Facebook can, too. Today, that’s what content producers tend to use Twitter and Facebook for. You author your content on your site, then spam Twitter and Facebook. Then people come out of those silos and read your content on the opened web. This addresses the first problem with blogging, and that is makes your blog your primary authoring tool on the web, which helps push it back into its spot as your online identity.

The Comments Problem

Another problem with blogs is nobody comments on them. It’s too hard to comment on a blog.

To be sure, an audience isn’t a problem: in your blogging, if you keep jabbing, and throw the occasional haymaker, and you do this consistently, you’ll get an audience, no matter your niche  topic. The problem isn’t from a lack of people.

Yes, even with an audience, people don’t comment on blogs. And part of the reason is the insane roadblocks you must navigate through to add a blog comment: OpenID provider? Do we know you? No? Sign up! Yes? Name, please! Password, please! Url, please! Type this hard to read CAPTCHA! Preview, please! Submit! Oh what’s that, we don’t support that HTML tag! Try again! OK! Now submit!

This commenting barrier problem has created an amusing phenomenon: the announcement of the blog post on Facebook gets more comments than the blog itself. Maybe 15 people will go back and forth about your blog…but they’ll do so on Facebook, not your blog. Ditto for Twitter. After all, it’s so easy to comment on Facebook; there’s no typing your name, no typing your URL, no preview, no CAPTCHA, no confusing OpenID provider selection, none of that. Just type your comment and hit enter.

One solution I’d like to propose to this problem is automated duplication of Facebook comments into blog post comments. Yes, if Daria M. writes a comment on your post announcement on Facebook, why not do her a favor and copy that comment onto the opened web, onto your blog? Make it automated. Suddenly, your blog posts have 40 comments instead of 5. And they’re all on the opened web.

Here’s what this would look like:

  1. Write a piece of software that looks at your Facebook feed.
  2. When that software detects a feed item that contains a link, unwrap the link (almost all services now, including Facebook and Twitter use web-breaking URL shortening services)
  3. If the unwrapped link points to a post on your blog, check the comments.
  4. If the comments exist on that feed item, talk to the blog services (e.g. WordPress, Blogger) APIs to post a comment to linked blog post.

End result: when someone comments on your Facebook status announcing your new blog post, comments to that status get reproduced on your blog. The same thing goes for Twitter and Google+.

Here’s what’s involved with making this work:

For #1, we’d need an app that talks to [social media service]. A Facebook app, in this case.

For #2, our software would need the ability to unwrap links from URL shortening services.

For #3, our software would need to work with the social media service’s APIs to fetch comments on a feed item. Facebook and Twitter already support this.

For #4, we’d need our software to communicate with [blogging service] to post a new comment to the blog. WordPress and Blogger likely already support this.

The feels like a problem that could be solved with the IfThisThenThat (IFTTT) web service. There, you can create recipes for [when something happens on the web] then [do this other thing on the web]. The problem, however, is it appears that IFTTT doesn’t have any tasks adequately powerful. While Twitter (and Facebook?) have RSS feeds for your feed, there’s no built-in IFTTT task for unwrapping shortened hyperlinks (step #2), fetching comments to feed items (step #3), or posting comments to blogs via blog APIs.

Could it be that this could be done with Yahoo Pipes? That feels a bit more powerful than IFTTT.

In any case, I’d like to see this done. I might just have to do it myself, but I’d love to find that someone’s already done the heavy lifting.

The Sick, Sad State of Windows Apps

Several months ago, prior to the announcement of Windows 8 app store, I tweeted:

What do I mean by “wild west” app store? I mean, isn’t it a good thing we have freedom with the internet to install any app we please?

The freedom is good, we should always have that option to side load whatever we want on our devices. However, the “wild west” model has devolved into a sea of pop-over ads, misleading links, hidden downloads, pleas for donations, and security nightmares.

Let me show you with pictures. (Let’s go shopping!) Today, I want to install one of the best, free Windows apps: Paint.NET. It’s a great photo editing tool, and I want to install it on my new work laptop.

Behold, the state of the art way to install Windows applications in 2011:

First, I’ll open my browser so that I can navigate Windows’ Wild West app store that is the internet. Now I’ll just type in and hit enter.

Umm…looks like I want the one on the left. I think. Grandma probably doesn’t know what to do here, so she’d close her browser already. But me, I’m tech smuggy smug smug smart, and I know it’s the one on the left right.

Alright, is it installed yet? Of course not, silly. We haven’t even downloaded it! So what’s next?

It’s that big green download button, right? I mean, it’s big. It’s green and stands out. And there’s a cute animal with a paint brush in his mouth. And since I’m downloading a paint program, that must be what I’m looking for!


That’s actually an ad. Clicking it takes you to a competitor’s product, GIMP, the popular open source image editing software. Of course, me being all techie in-the-know, I actually knew that. Grandma didn’t, but she gave up already. Her loss. I think.

Ok, where’s that damned download? Oh, silly me, it must be that other big green download button, with the nice big down arrow. For download:

Surprise, it’s not that either!

Haha, oh internetz, you are so funny. You tricked me! You tricked me real good. That big whitespace between the Big Green Download button and the “PDF Creator” label – you sure had me fooled!

Now that I’m aware of my situation of being in a software link minefield, I’ll just look around…

Ah! There we are. It’s no Big Green Button, it’s no Big Down Arrow, but it’s the name of the thing I’m looking for. I’ll just click that…

Erm, well, I thought I was there. But really I’m on some new page that, as far as I can tell, exists solely to show me fine advertisements from the classiest of internet ad vendors.

Ah, this just means I get to play Round 2 of Find the Download link. I know it’s not that Big Green Download button. That silly internetz already tricked me once.

Oh, I know, it’s that nice big yellow button, specially styled with double underlines! That must be it:

I know, I’ll just go mouse to click on it…

Oh noooes! It’s the dreaded Hover Sticky Pop Over. Another fine internet advertisement displays over the page, just by mousing over it! Imagine that, I don’t even have to do anything, and ads come flying at me!

Better yet, the ad is “sticky” — it doesn’t just go away on its own. You actually have to click on the ad (ha!), on that tiny little X button, to close the ad.

Ok, internetz, I promise not to move my mouse. I’ll just move my eyes, then navigate the hyperlink minefield to get to my good download. If I can find it…

Ha! I win! I found your damned download link! Take that, internetz! I may have lost a few battles, but I won the war, I have my download link! I’ll just carefully move my mouse through the whitespace and onto the download link. And now I’ll just click it and…

Wait – this isn’t my download! 😦

Oh, immortal internetz! You came back for more. Round 3 here I come! I was fooled in the last 2 rounds, but this time I will defeat you, and find my download!

I have learned the ways of the fake Big Green Download button. I now know to avoid that, and avoid the Other Big Green Download button, a internet advertisement warrior who makes his second appearance in Round 3.

I shall not be fooled again! I shall not click you!

And behold, I have spotted what appears to be the real download link! I shall carefully navigate my mouse past the Dreaded Hover Sticky Pop Overs, and I’ve managed to click what appears to be the real link!

Claim Round 3 for the humans!

After a sweaty, multi-round battle for my download, which involved feigned paths down rogue installs, navigating multiple hyperlink minefields, and outsmarting my way past the decoys, I’ve downloaded my software:


Am I done? Have I made it? Is this heaven?

No, silly. We’re only halfway there! So much more fun to come! Now I’ll just click on that zip file. Grandma might not know to do that, but she left a long time ago. (Maybe I should have followed her and taken up a career in knitting?)

Nay! Faithlessness begone! I shall see it through and be victorious. I shall click on this zip file to unzip it:

Oh, shoot. My unzipper isn’t registered. As creepy as that sounds, it turns out I’ve already purchased this software…on my home machine. Windows is too dumb to know that. Now, I could go hunting for my registration key — it’s probably sitting on my home machine. Or in a backup folder. Or a cloud drive. I don’t remember.

Anyways, I’m too lazy. WinRar developers were kind enough to let me use it anyways. I’ll just dismiss this message, and I should be good…

Oh dear. Some UAC prompt. That’s User Account Control, for you uninformed peasants. Even though if I said “C colon slash software Adobe twelve ee en you es dot exe” to my grandma, she’d think I’m speaking in tongues. But me, I’m super techy so I know that just means the path to an executable file.

But this scary prompt about a program harming my computer is frightening. Is it safe?

I’ll just assume it’s safe. Assuming I went to the right website, clicked the right download link, unzipped the right zip file, and launched the right executable, it’s safe. Probably.

Let’s cross our fingers and roll with that. I’m determined to win this victory. I am determined to triumph! I shall click “OK” to the UAC security prompt…

Ah, this looks right! Of course, it could be a phishing attempt. But it looks legit. I’ll roll with it.

Now, what are these options? Custom or quick? Um, what if I just want it installed? Quick sounds good, but what if it’s skipping stuff I need? Ahhh! Too many decisions! Analysis paralysis!

I’ll just pretend I didn’t see those options and click “next”. I hope it works…

It’s installing. I think.

But it’s been installing for about 2 minutes now. The progress bar moves ocassionally, but I’ve seen software where the progress bar just resets to 0 once it gets to 100, so maybe it’s not working.

I’ll just go get some Mt. Dew and come back in a few minutes…

Ok, I’m back from my caffeine and pee break. What was I doing again?

Oh yeah, Paint.NET! My long, drawn out battle is coming to a close! Victory is so close, I can taste it.

But first, more clicking. I need to click “start Paint.NET”. It didn’t start. Oh, that’s right, I need to click done or next or whatever. Then it should start. (I hope?)

After performing lots of clicks on the right elements in the right order, I believe I have appeased the MSI Installation Click gods.

My final goal has been achieved! In as little as…well, time doesn’t matter. In just a few…we’ll, clicks don’t matter. With bold confidence I…we’ll, the whole process invoked uncertainty.

Installing apps for Windows (and Mac) sucks. In 2011, it freakin’ sucks. This is why people are afraid to install native apps. This is why web apps are taking over and native apps are disappearing.

If Microsoft doesn’t fix this with Windows 8, the Mighty Microsoft will go the way of Sun. No one will buy Windows, because OS won’t  matter; everything’s on the web. And if no one buys Windows, no one will buy Office. Microsoft’s 2 big cash cows will dry up like the Negev. Microsoft desperately needs to make Metro apps work.

The App Store model, and Microsoft’s new WinRT/Metro APIs, promise to fix these problems. If Microsoft executes well, they’ll make Windows apps relevant again, and Microsoft will survive. If they fail, you’ll see a decade’s worth of corporate reinvention, perhaps the largest reinvention in history of the world.

All eyes on Windows 8.