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:

Move Your Silverlight Skills to the Native Web with KnockoutJS [slideshare id=12574854&w=425&h=355&sc=no]

View more PowerPoint from JudahGabriel

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 MessianicChords.com, 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 ultimate-guitar.com.
  • 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.

Seaching

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;
                feed.WriteTo(xmlWriter);
            }
        }
    }
}

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: MessianicChords.com/Home/UploadsFeed. 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>
   <div>
      <a data-bind="text: Name, attr: { href: DocumentUrl }" />
   </div>
</div>

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) {
      searchResults.pushAll(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 http://paint.net 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!

Wrong.

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:

Wooohooo!

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.

Blogs are dying, and I’m not sure it can be prevented

Blogs are failing for a couple of reasons:

  • They no longer serve as a person’s online identity.
  • They are unsuitable for polyglots: blogs tend to attract a particular niche audience; anything that mixes topics is not a good fit for a blog.
  • People don’t comment on blogs.
  • There’s no easy way to follow blogs.

I’ll explain these below, and propose some solutions.

Blogs no longer serve as a person’s online identity

That is, they no longer represent “you” on the web. When blogs started taking off in the late 1990s, a blog was where you represented yourself on the web. Anything and everything about you was your blog. That’s how you got yourself, your identity, on the web.

Example:  I’ve been running for almost a decade now my religious blog, Kineti, but it was not called “Kineti” originally, it was just the JudahGabriel blog.  My first and middle name. It’s because it was to represent me; my identity online. But that’s changed; blogs aren’t about people, now, they’re about topics, so it forced me to take my blog into a narrower direction. More on that in a moment.

Today, Facebook is your identity on the web. Or if you’re a tin-foil-cap holdout, email is your identity on the web.

The great thing about the web is that everyone on the web is a producer. You produce things. You produce pictures of your family. You produce status updates, you produce information about yourself. You produce thoughts on theology, or technology, or photography, or whatever interests you. You are the producer. Perhaps the greatest accomplishment of the web is that it made everyone a producer.

And when you produce your stuff, where do you put it? On your blog? Nope. You go straight to the social networks. You’ll post pictures of your Thanksgiving holiday on Facebook. You might tweet your pictures. If you’re old fashioned, you might email them out. Almost no one uses their blogs for this stuff.

So blogs aren’t the place to go for Anything About You. This space used to be owned by blogs. Now it’s owned by FacebookTwitter, and Google+.

Blogs are unsuitable for polyglots

When I started my religious blog nearly a decade ago, my tagline was “Tech, life, family, and faith.” Initially, that’s exactly what I posted about: technology thoughts. Stuff about my life and my family. And occasionally, thoughts about faith in God.

This resulted in a scatter-brained smattering of posts; today, CSS gradient techniques, tomorrow, Biblical Torah theology!

Worse, there was no audience for this. Who wants to read a blog where half the posts are [thing I care about] and the other half is [things I don’t care about]?

Nobody, that’s who.

And that’s how my religious blog morphed: I realized that to get a consistent audience, I needed to blog about a particular topic. A blog is Place for Topic X, not Person X’s Placejudahgabriel.blogspot.com is about Messianic Judaism and Hebrew Roots Christianity; it is no longer Judah’s place for tech, life, family, and faith.

This problem has exacerbated since then. You see, a major part of my life is technology. It’s what I do for a living. I give talks on technology. I have insight into the future of technology. If I posted all those technology posts over on my religious blog, we’d be back to square one: a smattering of posts on unrelated topics, with no audience caring to read them. It’s for that reason I started this blog: Debugger.Break(), where I post all things on my technologically-inclined mind.

But this is all part of the problem: blogs no longer serve as [Your Place]. They serve as [Place for topic X]. Topic Y goes elsewhere: another blog, Facebook, Twitter, Google Plus, whatever, but not on Your Place. This has resulted in a decline in blog relevance.

People don’t comment on blogs

Today, bloggers will write a post, then immediately spam it on Facebook via a status update like this:

New blog: What’s this crap Stallman just posted? http://debuggerdotbreak.wordpress.com

But here’s the amusing phenomenon: instead of commenting on the blog, everyone comments on the Facebook status update! I’ve seen this now with several of my latest posts: my Facebook status about the blog gets more comments than the blog itself. Likewise, for other bloggers, I’ve seen this same phenomenon.

Yes, the Facebook status updates get more comments than the blog itself.

Why? I see at three reasons:

  • Ease of commenting: people are already signed into Facebook; it’s easy to comment there. But to comment on the blog, you might have to authenticate with WordPress or Blogger orDisqus, or some other less trusted authority, maybe enter a hard-to-read CAPTCHA, hit preview, then submit. Yikes.
  • Visibility: everyone checks Facebook a few times a day, maybe more. How often do they fire up their web browser, type in your web address, and hit enter? Rarely. Your Facebook status update is more visible than your actual blog post. Heck, even direct email is more visible than blog posts.
  • Casual conduciveness: Blogs aren’t conducive to casual answers. People are afraid to comment on blogs. “Oh no, I’m going to get sucked into a big debate thread!”, or, “Oh no, my ‘nice post, I enjoyed the bit about X’ comment will look foolish compared to all these multi-paragraph responses!”

These things result in blogs with few or no comments.

There’s no easy way to follow blogs

When you log onto your computer in the morning, what’s the first thing you do? Check your email. Maybe check Facebook. Maybe you’ve got some email notifications from Facebook or Twitter. Oh, who sent me funny har har emails? Oh, who wrote on my Facebook wall? Who retweeted my wisdom-filled, perfectly-numbered twoosh?

Where does that leave blogs? Well, some dedicated fellow will eventually load up his web browser, type in the address to your lonesome blog, and hit enter. If you’re extra lucky, he might just leave a comment.

On Facebook, you automatically see your friend’s stuff: his pictures, status updates, all of it.

On Twitter, the Tweeple you follow show up in the flow of updates automatically.

For email, you automatically get all the stuff your friends send to you.

For blogs, there’s no “automatically.” It’s all manual. There’s no easy way to follow blogs.

Truth be told, there is something: RSS. Subscribe to this blog’s RSS feed, and you’ll automatically be notified of new posts. But, unless you’re a techie, most people don’t know about RSS, let alone what to do with it. First, you need an RSS reader, like Google Reader. Go sign up for that. Ok. Now come back to my blog, search the page for the little RSS syndication icon, and copy the feed URL. Then go back to Google Reader and hit subscribe. Paste in my link. Hit OK.

Congratulations, with only 17 easy steps, you’ve subscribed to my blog!

(Gah.)

There’s no easy way for people to follow blogs. And for that, blogs suffer.

In the next post, I’ll talk about some things we can do to make blogs relevant again. I’ll also make some predictions about future directions for blog publishers like WordPress and Blogger; they are ultimately in control of blogging relevance; it’s important for publishers to evolve, lest they, along with us content-producing bloggers, face death-by-irrelevance.

The Bell Tolls for Flash, and Silverlight isn’t far behind

The Flash ReaperThis week saw another victory for HTML5, and another nail in the coffin for web browser plugins: Adobe announced it was ceasing development of Flash on all mobile devices.

Mobile was easy ground to retreat from: Flash is already outlawed on numerous mobile devices, including popular consumer devices like iPhone and iPad. The only reason Google tolerated it on its Android platform was as a competitive advantage over Apple’s devices. And now that Adobe is abandoning Flash on mobile, it will soon disappear even from Google’s devices.

What does this mean for Silverlight? Amusingly, Microsoft chose a different strategy with Silverlight on mobile: they had the benefit of sitting on the sidelines and observing Apple laying the smackdown on Flash, and all the negative karma that comes from Steve Jobs cursing your beloved tech in public.

Even though Silverlight was originally called “WPF Everywhere“, Microsoft didn’t want the Curse of the Steve to afflict Silverlight, so Microsoft wisely changed course: Silverlight would not, in fact, be available everywhere. Just on desktops, and Microsoft’s own mobile device.

Adobe simply conceded that they lost the battle of Flash on mobile. They lost the battle because they don’t own those platforms, and those who do own those platforms — Apple, Microsoft, Google — are at best ambivalent about, and at worst, enemies, of Flash. Ditto for Microsoft’s Silverlight: Microsoft knew they couldn’t win on mobile when mobile is largely controlled by competitors, so where Adobe tried and failed, Microsoft wisely didn’t even try.

With the mobile battlefield now surrendered to HTML5, one might knee-jerk a thought that Flash and Silverlight are safe on the desktop, at least.

But that battle, too, will be lost: web sites are being rewritten as Flash-less. Oh, and Microsoft’s next operating system won’t run plugins like Flash and Silverlight. Or rather, it will run web plugins, but it will first make you launch some other legacy system and then inside that legacy system, launch a differently-configured browser and then navigate to a site that uses Flash, and oh, screw it. No one will run web plugins anymore. And, per Apple’s usual modus operandi, there will be a Mac OSX release, codenamed Metroid, several months before Windows 8, and it will not support web plugins, either, and everyone will hail Apple for making a bold, innovative move.

In the Great Plugin War of the 21st century, the mobile space has been abandoned by the plugins. And soon, in the next 5 years, the desktop space, too, will be abandoned. By 2016, web browser plugins like Flash and Silverlight will be as antiquated — and generally disdained — as much as Java applets are today.

Silverlight and Flash developers: it’s time to reinvest your skills elsewhere

In the classic western film, The Outlaw Josey Wales, Confederate soldier Josey Wales is betrayed by his old commander, Captain Fletcher, and, being filled with rage at old Union soldiers for murdering his family, Josey seeks vengeance years beyond the conclusion of the Civil War. But as the plot winds down, a disguised Josey comes face-to-face with his old commander Fletcher, who speaks a piercing truth to Josey:

Fletcher: I reckon I’ll go lookin’ for Wales down in Mexico.

Wales, disguised: And then?

Fletcher: Well, he’s got the first move. I owe him that. But I think I’ll try to tell him the war’s over.

Web plugin developers, the war is over. It’s time to move on.

For reasons outside your control, your platform is disappearing, and will soon be gone. Get out before it really hurts.

If you are a Silverlight or Flash developer, now’s the time to reinvest your skills in another platform. HTML/JavaScript is the safest bet, although it’s a crowded space. Native platforms like iPhone and Windows 8 Metro apps are riskier, but the rewards of succeeding on those platforms is greater. If you’re a Silverlight developer, the natural evolution for you is Windows 8 Metro: you’ve got a subset of XAML and the .NET framework on Win 8 Metro, just like you did on Silverlight. You’ll be right at home.

We think of this as the Great Plugin War of the 21st century, but really, it was never about plugins. Vendors like Sun, Microsoft, and Adobe really just wanted people writing code for their platforms. They didn’t care if it was via web plugins, desktop apps, whatever, it didn’t matter, as long as it was their platform. That way, they can sell tools, support, and generally make money hand-over-fist being god of Platform X. When these vendors saw the ubiquity of the web, they thought, “Hrrm, how about we make our platform run on the web? Then our platform will be everywhere the web is!” And that, friends, is how web plugins were born.

This was was, and is, about getting people to write code on proprietary platforms. Now that the native HTML5-ified web is powerful enough, we don’t need web plugins. And so, the big tech companies will have to look for another way to make developers write code for their platforms. The new battleground will be mobile, I predict, with each tech company heavily investing in their own mobile devices, where they control the platform, where native apps make sense for now, and where they can make money hand-over-fist being god of their own platforms. Microsoft will dump truckloads of cash into Windows Phone. They’re eventually rename it, too, since “Windows” sounds so…antiquated. Google will be king for a long time. Apple will be the choice for hipsters. And writing an app that reaches all your users will, once again, require writing your app thrice, once for each platform. That is, until the web becomes powerful enough to make mobile apps irrelevant, just like it did for desktop apps.

Though plugins have been the way of the web for a good 15 years, it will be — nay, it is — no longer. Plugins are going the way of the dodo. The bell tolls for Flash, Silverlight, and JavaFx.

The web is the future. And tomorrow’s web is plugin-less. Position yourself wisely.

Introverted Nerd Discovers Public Speaking, Enriches Self

I spoke at Twin Cities Code Camp this weekend, which is perhaps the largest software developer conference in Minnesota. I gave a talk on KnockoutJS, a JavaScript library for data-binding in HTML/JavaScript apps.

My ridiculous slides and code available for download here.

The talk went really freaking well! It was a lot of fun to give the talk: the audience was sharp and engaged, asked some tough questions, and I had good answers for most of them. The auditorium was quite full, a packed house, which makes things all the more interesting.

Afterwards, I went on Twitter to see what people had to say about my talk. I was ecstatic reading these. Seeing these praises from my peers sent me on a day-long high of endorphin release. Excuse me while I toot my own horn, but I’m just so stoked to hear all this:

Jeff is a well-known developer here in the Twin Cities, and, if I’m not mistaken, a co-founder of The Nerdery. Hearing this was particularly encouraging.

“Coding without a net” refers to writing a lot of code on the fly in front of the audience, along with some impromptu changes to the code in reaction to the questions and promptings from the audience.

The audience was really sharp. “What happens when you do this? Does X follow?” So I tried it out, right there on stage. It was a blast.

During the talk, after all these challenges from the audience, and successfully getting them working, I joked, “I’d better see some good stuff on Twitter about this!”

There were several questions from the audience that I had anticipated and built into my talk. This caused a few people to joke that I had planted ringers in the audience to ask the right questions.

Well folks, I am stoked. I am really happy I summoned the courage a year or two ago to try my hand at public speaking. As a formerly-homeschooled, introverted nerd, I was frightened to death by the idea of public speaking. Now that I’ve done these tech talks 4 or 5 times, some in front of rather large audiences, I’m patting myself on the back for getting myself out there and just f-ing doing it. I freakin’ love giving talks now. And my career advances as a side benefit.

So yeah! Go me!

Hearing praise from your peers, particularly from intelligent, successful people in the industry is all the more encouragement. Can’t wait to do it again next year.

Are you serious about your craft? Get out there. Go meet other developers, give a talk, surround yourself with other nerds. You’ll be glad you did, and a better developer for it.

Silverlight isn’t dead. But it will be web-irrelevant in 5 years.

Everyone was thinking it. Google was pushing it. Apple was pondering it. Microsoft was fighting it. (They aren’t anymore.) It was on everyone’s mind:

“Why Flash when HTML can do 99% of what we need?”

And that sentiment extended to Oracle’s Java and to Microsoft’s Silverlight. To every web browser plugin, really. Everyone was thinking it.

After all, why should users have to install a piece of software to view something in their web browsers? The path of least resistance dictates users will just not view that content, and, at some point in the future, technology will evolve and move on, leaving those barriers — Flash, Silverlight, Java — in the junk heap of failed and left-behind tech.

It was only months ago that we witnessed the first leap, the first bit of tech that deliberately left behind the barriers of Flash, when Apple took a bold leap of faith: no Flash or Silverlight on the iOS. And since iPad and iPhone were hugely popular consumer devices, this was sure to stir the waters.

People complained, developers gnashed teeth, consumers wailed.

Angry, but for a short time
Angry, but for a short time

But, here we are, a year later, and, it turns out, people are getting along just fine without those pesky plugins. HTML just works for almost everything. In fact, people are kind of liking this plug-in less idea. Google Chrome now renders PDFs not with a heavyweight plug-in from Adobe, but with just HTML. YouTube can render videos without crashy, always-updating-at-the-wrong-time plugins, but with HTML 5 <video> tags.

A digression and admission: sure, developers love plug-in development and the well-designed, type-safe languages like C#, preferring that over the wild west that is Javascript programming. As a developer of a large Silverlight app, as someone who’s championed Silverlight, as someone who’s written articles about Silverlight programming, who’s regularly attended Silverlight user groups, Silverlight is an amazing programming environment, a real web application platform, a manificent piece of software engineering, really.

Web programming, on the other hand, looks and feels like decades of hackish attempts to bolt application development on top of a document display system. Probably because that’s precisely what the web is: intended for document display, warped and fashioned and hammered into something that resembles an app platform. Lot of warts, but then again, the web has always evolved that way.The perfectly-designed systems, though perfect, are always late to the game. HTML was first, and so it will win out. The plugin-less web wins because it was there first.

If we developers were transported back in time to the web’s beginning, we’d fashion something different than HTML+JavaScript. It’d be a real app platform akin to Silverlight, with a well-designed language like C#. But, in the absence of time-travelling technophiles, we’re left with the present and inevitable future that is plug-in free HTML.

And that plugin-less web is coming, to be certain. It’s already here on virtually all mobile devices. Even Microsoft’s own Windows Phone 7 doesn’t display Web Silverlight content on their phones. If anyone was going to support Web Silverlight on a mobile platform, it was Microsoft. And when they built this new mobile OS from the ground up, they wisely chose to not support Web Silverlight.

As recent as last week, we’ve seen even more fruit of this trend back to the HTML roots of the web as Microsoft demoed their Windows 8 operating system, with its new Metro UI. In it’s default state, Windows 8 doesn’t run Web Silverlight.

If there was any doubt as to the future of Web Silverlight, this is the clear writing on the wall.

And to be certain, it’s true: Start Windows 8. Launch IE10. Browse to a Silverlight site. Ita-no-worksie. Why? Because Microsoft, as they wrote in last week’s blog post, are headed toward a future of a plug-in free HTML web, and that future starts with their new browser and new operating system.

Truth be told, it’s really a requirement for the whole Metro app security model to work: if plugins could run inside Metro IE 10, it would provide an easy way to side-step the whole security model: just write some nasty malware as a plug-in, have IE Metro execute it, and you just took over the Metro environment. I predict Microsoft will not renege, despite Silverlight developer protestations, on the “no-plugin” stance of IE 10. Windows 8 will be released with the inability to run Web Silverlight content through its default Metro interface.

Now it’s true, Web Silverlight, if you go out of your way to do so, can run be run on Windows 8: Boot Windows 8, launch the classic desktop “app”, launch the desktop version of IE, navigate to Silverlight site. Sure, that works, and thank you MS for providing that, but effectively this will render Web Silverlight irrelevant. Just think, what developer will build a site with Flash or Silverlight or Java, knowing their site won’t work in the default experience on the world’s most-deployed OS? (Not to mention the ever-growing plugin-less mobile devices!)

No one, that’s who. And that’s why Web Silverlight will be irrelevant in 5 years.

So where does that leave Silverlight developers today? In a surprisingly “angered but ultimately OK” position. Silverlight apps, already being a subset of .NET framework functionality, will map to Windows 8 Metro apps easier than any other platform: easier than WinForms, easier than MFC, easier than WPF, easier than Flash, Java, even easier than HTML/JS apps. Silverlight developers are actually positioned quite well.

Furthermore, Silverlight isn’t going away. It’s true Silverlight will be irrelevant on the web, but it still has a nice workable future on Windows mobile phones, which over time, will gain market share at the expense of Apple’s and Google’s devices. It’s only Web Silverlight that will be, and is already quickly becoming, irrelevant. Silverlight mobile, and Windows Metro apps are essentially a kind of Silverlight: XAML, .NET framework subset, self-contained, sandboxed.

Silverlight for the web is dying and will soon succumb to the same alive-but-irrelevant fate as Java applets. But the good news is, life for Silverlight developers is surprisingly bright in the XAML filled world of Windows 8 and Windows mobile devices. Technology moves on, and developers will follow, even if kicking and screaming, lest they, too, be rendered irrelevant.

Windows 8 to abandon nerdly types

The new Windows 8 bits were demo’d this week at Microsoft’s BUILD conference, and it’s sparked a lot of discussion in the developer community.

Microsoft is turning a new leaf: all existing Windows apps are now “legacy” apps. They’ll only work in this super-special classic Windows desktop that runs, itself, as an “app” in Windows 8.

The classic desktop is gone, superseded with a sexy new Metro home screen. The start menu is gone, superseded with live tiles and semantic zoom. The apps are gone, replaced with new sexy Metro style apps. Heck, even Windows’ namesake is now a misnomer; there really aren’t windows in Windows 8.

Times, they are a-changin’.

Over at CodeProject, there was a discussion about all this changing, and how all the UIs are big and dumbed down and instead of a million menu items we have a big ribbon with big icons and oh what are we to do?!

Said one commenter,

You must understand that Windows 8 isn’t about managing files. It’s about updating your status on facebook, sharing photos, and downloading MP3’s.

He’s kind of right. Really, Windows isn’t about file systems and disk defraggers and command lines anymore. Squint a tear for the good ol’ days,  but now that regular people using computers far outnumber the tiny elite nerd minority, Microsoft is now about the non-nerd. The consumer.

Or perhaps better stated, Windows 8 is for consumers, and that isn’t necessarily a slam. MS is making Windows friendly to regular, non-nerdly types. Consumers don’t like file systems. So it’s largely hidden from view.

I remember back in the late 1990s, a tech futurist had predicted that file systems would disappear from the consumers view eventually. At the time I thought he was a little crazy, but now I see the wisdom in what he was saying: only nerds care about file systems. We have good reason to care about file systems. But most end users don’t, and in fact, letting non-nerdly types futz with the file system might actually be a bad idea.

Even the whole Metro environment aligns with this idea that, unless you know what you’re doing, all your apps should be isolated and safe by default. Want an app that does something outside that box? Ok, open the car hood, crack open the full Windows desktop, install that bad boy. But for everything else, and for most apps, and for most people, you don’t need that, and in fact, having that power is detrimental as non-nerds tend to install dubious apps that crap all over their systems.

I hope all my relatives and friends who call me to fix their systems, I hope they all install Windows 8 when it’s out. And I hope they never have to crack open the hood and futz with their file systems, or need to install “classic” Windows apps. If they stay in their walled Metro garden, they won’t need me to bail them out every few months.