Kevin Marshall's Epic Work Blog for Awesome People

@ksmarshall - i <3 software
in

September 2009 - Posts

WhiteboardFlow: Sketchflow like Multi-touch Windows 7 whiteboard

So FB7 was our fallback Code7 contest application. It’s a teaser. Our second entry is going to be epic. At Clarity we really like SketchFlow, but there are some things that would make it cooler I think. When working in a group we usually just draw on a whiteboard to map out the application flow. It’s not as easy to have a collaborative session sitting at PC and using Blend.

Our plan for the second entry is to build a large multi-touch display to put up like a whiteboard. Using your fingers like markers you can draw UI elements like windows, buttons, text, etc. The app will then recognize certain gestures. For example, you draw a really large rectangle and the app assumes you want a window. It converts that to a window. If you draw a smaller rectangle inside of the window, it’ll convert it to a control where you can hold two fingers on it to bring up a fly out menu and convert to a textbox or button. Small rectangles are converted to checkboxes and small circles, radio buttons.

Here is the first prototype of the gesture recognition for controls.

 

In future versions we’re adding a marker drawn style, text recognition to convert labels/titles to hand drawn font, flow recognition (draw an arrow from a button to another window to link the two), network support for remote multi-user action, manipulation to resize controls and then try to work out a way to get this into SketchFlow. The basic idea is that it’s a simple, collaborative first step before touching up in SketchFlow. I’ll post some more prototypes next week as we finish it up for the contest.

FB7: Facebook Desktop Notifications for Windows 7

I was recently using the Facebook Desktop Notifications app for OSX. Pretty cool & useful app. The shortcut layout reminded me of the Win7 jump lists and I wanted to build something for the Code 7 contest. Since I was also doing some work on the Facebook Developer Toolkit (version 3.0 is awesome), this seemed like a nice app to build. Here is what I have so far:

Jump list shortcuts to Facebook pages and new messages / notifications

The jump list provides quick access to your latest messages, notifications and general Facebook pages.

image 

Progress indicator when polling Facebook and unread message/notification count overlay

It was nice to bust out my old school GDI drawing skills to render the little number on the overlay icon.

image

Toast when new messages / notifications arrive

The toast message fades in and out for about 3 seconds when something new arrives. FB7 polls Facebook every 5 mins for new items. If you only have one new item it will just display the subject or title or snippet.

image

Global keyboard shortcut to update status

Defaults to ctrl+alt+space, but you can change it to anything. The window pops up with a little blur animation.

image

You can also attach videos or photos via drag and drop or by clicking to browse your Win7 libraries.

image

Settings screen 

You can toggle to Facebook Lite mode so all jump lists shortcuts link to the equivalent Facebook Lite page.

image

Custom thumbnail to show current profile photo & status

image

 

Here is a video of the application in action.

 

It probably would have made more sense to make an application that runs in the tray, but I wanted to experiment with some of the new Win 7 shell integration features. I’m fairly sure I violated every UI guideline in the Win 7 shell integration guide and also most of Facebook’s terms by using their icons / logos. Also, it’s just a notification app, you can’t view your news feed from inside the app – the idea was just to port the OSX Desktop Notification app to Win 7.

Win7 has definitely grown on me. As a developer I wasn’t particularly excited about some of the shell integration points, but I think you can add some pretty nice features to your app with them. As an end user, Win7 is definitely a big improvement on Vista. Feels faster, has some nice UI tweaks and is overall really stable.

If you are interested in trying out the application to help test, email me at kmarshall at claritycon.com or send me a message on Twitter (@ksmarshall) or on Facebook

Building Cloud Applications: Windows Azure vs. Google App Engine

I’ve used Windows Azure to host a few apps and Google App Engine to host one small app. Clearly this qualifies me to make a definitive post comparing  the two. I’m leaving Amazon out of my cloud app comparison because a) Azure and App Engine seem like more direct competitors and b) I have almost zero practical knowledge of Amazon’s offerings – It’s all theoretical.

In general, I’m excited about cloud computing and I like the options that are out there. For small departmental LOB apps it’s nice to have a quick place to deploy to without requiring new server environments. For something like a Facebook app that might need enormous scale quickly, Azure or GAE makes this really easy.  I think Microsoft did a great job of creating a product to ease people from stand alone windows servers to a cloud environment with hosted services, azure and the ability to mix on and off premise pieces of an application.

Here are some reasons to use Google App Engine (GAE) and advantages of the platform compared to Azure

  • Want to write code in Java, Python/Django or any language that runs on the JVM
  • Need integrated mail functionality
    • Azure requires your own SMTP server outside of the cloud environment
  • Need integrated XMPP messaging
    • Again, Azure would need an external server.
  • Need scheduled processing jobs
    • You can be creative and write something with queues and/or worker roles or perhaps a service running elsewhere to ping your web server on a schedule to run a job.
  • Need distributed caching via memcahe
    • There has been some talk of adding Velocity to Azure which would be comparable to memcache. Otherwise, if you only have one web instance you can use ASP.NET caching. If you have multiple web instances, then you need a way to invalidate the other server’s cache. Inter-role communication is coming soon which would make this possible. In the mean time you could use .NET service bus to communicate between web role instances (in theory it seems like this would work)
  • Want mostly free hosting for small applications – GAE has a free quota
    • Azure is free up to a limit in the CTP, but once live nothing is free. I’d really like to see Microsoft keep some free version for developers to experiment with or include CTP-like free quotas to BizSpark members. Developers like to tinker and release small apps. If App Engine is free, they are going to chose that and will probably be less likely to chose Azure once comfortable with GAE. It seems like a good approach to provide some level of free support until an app becomes large enough where a developer can afford to pay (or it’s too costly to provide them free service)
  • GAE has a ridiculously fast deployment time. One click in GAE launcher or a console command and the application deploys in less than a minute
    • Azure deployment is just brutally slow. Make a sandwich, grab a good book – it’s going to be awhile. This is especially an issue when you consider the next bullet point. Every time you deploy to Azure it’s provisioning a new virtual machine unlike GAE which is just copying files. I’m sure there are good reasons why this needs to be done, but I really wish it had some quick deploy / file copy option. There is nothing more gut wrenching then waiting 30 mins to finish deploying and you forgot to to change one line of code. Now you are stuck waiting another 30-45 mins to delete the current instance and redeploy.
  • If it runs locally in GAE, chances are very high it will run the same in GAE once deployed
    • Some things I do that work fine locally in Azure don’t work in the cloud. 99% of the time it’s my fault so I’m not blaming Azure, but it seems to happen to me somewhat regularly. Unfortunately I don’t have specific examples, but I’ll Twitter them as they come up. This wouldn’t really be an issue for me if I could quickly view logs and redeploy on Azure.
  • GAE has excellent utilities for CRUD operations on your data store
    • Once you deploy to the cloud in Azure you can’t easily view/delete/edit/add entities to the storage systems. I wrote my own utility which I’ll post soon to do that and there are some others out there with various levels of functionality. It’s still kind of a pain though and the ability to do this would help debugging.
  • GAE is fast to change code. For most code changes you can just change the line and refresh the browser.
    • In Azure this can be a real pain. First it’s managed code so you need to compile. Second, debugging Azure deploys itself to the local dev fabric. If you make a change to one line of CSS or JS or HTML in Visual Studio, then you have to stop debugging, change the line and re-run which takes a min. or two. When you are making small changes like a line of Javascript this is super tedious. It almost made me cry. I had to make a 2nd web app in my project, move the js/css into there and change the links to reference those in the web role. That way I could make changes without having to stop my local development server. This can’t be right. It’s awful. Clearly I’m an idiot and am doing something wrong. I really don’t understand how people are building complex UIs in a web app if this is the case.
  • GAE lets you view logs in real-time
    • Viewing logs in GAE can be done through the apps dashboard. In Azure I need to go to the portal, click to copy the logs to the Blob store which takes some time. Then I have to compile the Drive Mount powershell script, configure with my credentials, run it, mount the drive, browse to the log dir on the blob store, copy them locally and view. Granted once you have the script compiled and the drive mounted you only need to click copy on the portal and copy them via the command line and view. Still it’s slow and cumbersome. For a CTP it’s mildly acceptable, but Microsoft really needs to add some sort of online log viewer if I’m going to be paying for this. The only way to troubleshoot what’s wrong when you deploy to the cloud is via the logs and Azure makes this somewhat painful.
  • Simple API for accessing GAE data store
    • Part of this is just comparing python to C#, but it’s a lot fewer lines of code to define a model and do any CRUD operations on it in GAE
  • Some useful data store functionality
    • GAE supports list properties and referencing other entities. In Azure you could just serialize a list or convert to JSON to store multiple values, but not as convenient. The references property also makes transitioning from a relational store to a flat table storage easier. Azure it’s a little more of a pain to get referenced entities and it’s all manual.
    • Secondly you don’t have to worry about creating unique row keys in GAE. In Azure each entity needs to specify a row key and partition key. They also have to be named RowKey and ParitionKey which seems odd when you can specify the attribute: [DataServiceKey("PartitionKey", "RowKey")] Then I need to add some comments and remember my row key is really my username or something.
    • Indexes. In GAE you can add indexes to some columns with some restriction. For now Azure doesn’t support indexes on any columns besides the key
    • GAE supports transactions which is helpful when changing multiple dependent entities
  • No hassle config – you basically have an app that scales without worrying about partitioning data or adding instances.
    • In GAE the app automatically scales. In Azure you need to change the config to add new web or worker role instances. This requires more monitoring and it’s also harder to write worker roles that balance effectively especially since in code you can’t tell how many are running. You also have to think more about partitioning your data, but I suppose that might let you you do more performance tuning.
  • Development environment on Linux/OSX/Windows
    • Azure development requires Windows.

Here are some reasons to use Windows Azure and advantages of the platform compared to GAE:

  • Want to write code in PHP or .NET (C#, F#, VB.NET).
    • It’s interesting how between the two they support most languages but there isn’t much overlap unless you try to do something crazy like run PHP on the JVM or IronPython on Azure.
  • Want interactive debugging while developing locally. Some people log extensively, but I like to live by the breakpoint.
    • Actually this is probably possible in Eclipse for GAE, but I haven’t tried that out.
  • Need background processing. In Azure you can have a worker role running 24/7.
    • In GAE you need to specify a cron job to run on a schedule. The cron job needs to ping a url which executes a task, but that task is limited by the request timeout. Basically you have 30 seconds to finish processing while Azure can run for hours on a single task.
  • Need flexible queue storage. In Azure, queues work like I’d expect a queue to work. I put data in, something gets it out. You can specify time to live and the visibility time when some process grabs a message off the queue
    • In GAE the queues work a little differently. It’s nice that you enqueue data with the function to call, but you are still limited by the 30 second time limit to execute that work. The support is also still experimental
  • More robust blob storage. In Azure there are great methods are dividing up large files into blocks and retrying failed blocks. This makes uploading large blobs easier.
    • GAE blobs are stored in the regular data store and are limited to 1MB. Azure supports 50GB blobs.
  • Staging environment. While deployment to staging is slow in Azure, it only takes a second to switch from staging to deployment. This is great for cutting over new builds.
    • In GAE you’d have to manually create a 2nd staging site and manage that process. You could probably write some scripts to do all this, but it’s built in and easy in Azure
  • Relational and Table Storage
    • If the thought of using a non-relational store makes you cower in fear then Microsoft also provides SQL Azure – the same relational db running locally available in new cloud friendly form. Personally I prefer one giant table, but the option is nice.
  • .NET service bus integration. If you have Active directory you can somewhat easily integrate authentication between your apps on Azure. Although most of the .NET service bus infrastructure is REST-based so you could probably use some of those features in GAE with a little bit of work. You could also do things like host your data store locally in SQL server behind your firewall, but host the web front-end in Azure. This lets you gradually migrate to full on cloud apps or keep sensitive data in house or reuse some existing non-cloud services.

Between the two I think you have good options depending on the type of apps to build. The development time on GAE feels faster to me because of deployment, log viewing, and probably just less code in Python vs. C# The cost of GAE makes it a little cheaper to launch new applications.  In some cases background processing or relational storage are a must and Azure is a better choice. Or if you need to leverage some onsite data or services, then Azure is great. If you are porting an existing app then your choice is most likely made by which language the current app is written.

While I really do like Azure, the previously mentioned development time issues combined with my Visual Studio not being able to make CSS/JS/HTML changes on the fly make me hesitant to use Azure for casual projects. I probably spent around 30 hrs to code all of TwtMyCard on Azure. In App Engine I maybe could have saved a few hours because of writing a little less code in Django/Python and the GAE data store. But on top of the 30 hrs in Azure I easily wasted 10-15 hrs with deployment, tracking down issues in the cloud, getting the logs and fixing HTML/CSS/JS.

If Azure added web viewable logs, fixed the VS issue, supported Velocity, supported indexes and added inter-role communication, I’d be so happy.

Regardless of hosting choice, I love not having to mess around with web server or database configuration to deploy an application that scales reasonably well (in theory – still waiting for Silverlight Draw or TwtMyCard to reach 1 million users to verify).

In the future I’ll update this post as I use them both more or people tell me I’m wrong about some things or the products evolve.

Silverlight Drawing via Twitter and Google App Engine

I am currently in my Twitter app development phase. I will not rest until all possible uses for Twitter are exhausted. If I can’t monitor the contents of my fridge via Twitter, I will consider this year a failure. So after TwtMyCard with Azure I thought I’d try out App Engine. For a long time I really wanted to build layer tennis with Silverlight canvases. I think I’ve mentioned this idea to Adam Kinney at every event I’ve seen him at since Silverlight was launched. Since it’s been a few years without progress, I clearly need to take some baby steps. So the first milestone in Silverlight layer tennis is dynamically parsing and adding Xaml. Not super hard, but I wanted something simple to build on App Engine and Google data storage in a few hours. You can check out the app at http://silverlightdraw.appspot.com/ To use, you just have to tweet a line of xaml to @sldraw.  To maximize your 140 chars you can alias Xaml. e.g.

<#e Fill="Yellow" #h="100" #w="200" #st="2" #s="Black"> is the same as
<Ellipse Fill="Yellow" Height="100" Width="200" StrokeThickness="2" Stroke="Black" />

You can also click on any of the Xaml tweets in the the sidebar to spotlight that layer or click download to get the current Xaml on the canvas.

As for the using Silverlight on App Engine, it’s pretty easy to communicate via json. App Engine can return any data as json through simplejson and you can consume json in Silverlight via the JSONObject. The only thing special you need to do in the app.yaml for App Engine is to add a handler for Silverlight:

handlers:
- url: /content/bin/SLDraw.xap
  static_files: content/bin/SLDraw.xap
  upload: content/bin/SLDraw.xap
  mime_type: application/x-silverlight-app

On App Engine there is a cron job to query Twitter every minute for new Xaml tweets so feel free to tweet some xaml and see the results in near real-time.

If you’d like to see the code, you can download it here.

TwtMyCard : Exchanging Business Cards via Twitter

Anand Iyer told me about an idea he had for an application to exchange business cards over Twitter called TwtMyCard.  I wanted to experiment a bit with ASP.NET MVC, Windows Azure and Twitter bots so I offered to help build the first version. Plus I thought it would make a nice demo application for some of the work we do at Clarity since we can’t always show off the applications we build for clients. And so TwtMyCard was born. Anand already wrote a nice post describing the functionality and benefits.

Here are some of the reasons I like the idea for the application:

  • Unlike Facebook, it’s easy to export out your contacts – No walled garden here, it’s your data where you want it
  • You can quickly add your profile by uploading your vCard from Outlook and avoid the pain of entering the same profile information into a new site
  • Lots of people already network via Twitter so this seems like a natural extension
  • You don’t have to follow each other on Twitter or create some relationship on another social network - If you just want to exchange contact info, you can do that with TwtMyCard
  • Better for the environment – Unless your business card is die-cut, foil-stamped and embossed , it’s probably going to just get thrown out at some point
  • Since you can send a tweet via SMS, you can use TwtMyCard from any mobile phone. Although if you are using a Twitter client you should check out Gadfly (gratuitous cross-promotional plug).

Here are a few other notes on the functionality:

  • You don’t need to create a login for TwtMyCard. You login to Twitter via OAuth and it passes a token to TwtMyCard to authenticate you. This way we don’t collect your Twitter credentials and you have one less password to remember.
  • Your business card is marked private by default meaning that you have to send it someone before they can view it unless you mark your profile public. The cards are sent via the TwtMyCard account so it will show up in the recipient’s feed as a mention. Through the TwtMyCard site you can also send cards from your own account or a direct message.
  • You can quickly import your profile by uploading a vCard. You can also export anyone’s contact info as a vCard or by exporting to Google contacts. (Export to Live contacts coming soon)
  • Everyone’s saved card uses the hCard microformat. If you have a microformat plug-in for your browser like Oomph for Internet Explorer or Operator for FireFox then you get some bonus functionality. Below is a screenshot of the awesome looking Oomph plug-in.

image

 

If you like TwtMyCard or have any ideas you’d like to see implemented, let us know.

In future blog posts I’ll talk a little more about the code for TwtMyCard and some of my thoughts on Azure and ASP.NET MVC. Overall the experience of using MVC on Azure was pleasant minus some issues I had with Azure. Also JQuery, Blueprint CSS, TweetSharp and the Famfamfam icons sped up the development effort considerably. Thanks to all the developers / designers who built those. Not that it’s a super complicated application, but it’s great when you can mix and match some proprietary code and some open source code in a few nights to create a (hopefully) scalable web app. And big thanks to Anand for the idea and help launching the site.

Building a Better Windows Mobile Development Experience

I really want to do Windows Mobile development because I love the potential for mobile application augmenting our daily experiences. Web apps are locked in my browser which is locked in a desktop that just sits there. Location awareness is not really important and there isn’t much exciting reality to augment. The problem is that every time I open up a new windows mobile project in visual studio, I realize how much building something is going to suck. I’m still amazed that Apple went from no developer platform to the best one in about a year.

Here is a nearly comprehensive list of my gripes and suggested improvements:

  • WPF / SL mobile. I’m all in on declarative markup for UI development. Especially on mobile with sizing things for different screen sizes / orientation, the WPF / SL layout system would be awesome. Not as excited about SL unless it runs out of browser with direct hardware access. Which would basically be WPF. So WPF mobile. Having animation and total control styling support is the only way to make experiences on par or better than the iPhone. The default WinMo forms look and feel doesn’t really cut it and animation isn’t exactly easy in WinForms. Right now the current state of compelling UIs is here. That is a lot of code for just a prototype to make a decent looking button.
  • Managed APIs for sensors. Apple has cool apps with the accelerometer and GPS and compass because it’s easy to use the APIs around that. Granted they have basically one phone to support. But still, force phone makers to build drivers for a sensor API like the one on Windows 7.  Look at the current situation – there is a “Unified” API on Codeplex for the accelerometer that supports 2 phone types. I don’t want to write one off code for this or that type of accelerometer.  Also:
    • Compass. Similar situation to the accelerometer. It’s hard to build an app in the app store using the accelerometer if every manufacturer is going to use a different driver API.
    • GPS / Cell Tower Triangulation. Currently GPS has a nice API but cell tower location uses this mess. With all those caps I feel like the pInvoke is angry with me. Can’t this be wrapped into the same managed GPS GetPosition method? Sure I could write the suggested location factory and implement both. Or you could write it and put it in the framework so all developers could have 1 location API that works.
    • public delegate void RILRESULTCALLBACK(uint dwCode,
              IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam);
          public delegate void RILNOTIFYCALLBACK(uint dwCode,
              IntPtr lpData, uint cbData, uint dwParam);
       
          [DllImport("ril.dll")]
          public static extern IntPtr RIL_Initialize(uint dwIndex,
              RILRESULTCALLBACK pfnResult,
              RILNOTIFYCALLBACK pfnNotify,
              uint dwNotificationClasses,
              uint dwParam,
              out IntPtr lphRil);
          [DllImport("ril.dll", EntryPoint = "RIL_GetCellTowerInfo")]
          public static extern IntPtr RIL_GetCellTowerInfo(IntPtr hRil);
          [DllImport("ril.dll")]
          public static extern IntPtr RIL_Deinitialize(IntPtr hRil);
  • All APIs in managed code. I’m sure that’s a lot of work, but it’s not fun digging though the C++ docs to figure out how to pInvoke some function if you’ve already built the whole app in managed code because some key APIs are missing. It just feels wrong when I have to start dropping in some unmanaged structs to call SOMECRAZYLONGNAMEDFUNCTION
  • Speech Recognition. The .NET desktop one is good. Toss that on the phone. Don’t worry, I’m not going to steal your Voice Commander app. Just let me process speech.
  • Video Capturing. I fairly certain this can be done well enough via Direct Show, but this could be way easier. On openframeworks in C++ I can process a video stream in about 5 lines of code.
  • XNA. The Zune supports XNA, why not WinMo. Surely it must be possible. Oh and include some APIs for WinMo to XBOX connectivity to add a new dimension to games
  • Replace Compact Framework with full .NET. At some point can’t WinMo just be Windows 7 core running full .NET?
  • Expose everything via APIs. It seems like Apple just took all the APIs they use to make the built-in iPhone apps and made them public. Look at the apps other developers made on top of those.
  • Push notifications. That was a a good idea on Apples part. I think background tasks have a place like letting me stream music while doing something in another app, but I don’t need Facebook running 24/7 to poll for new mafia wars updates from some guy I barely knew in high school. This feels like it should be in Microsoft’s wheel house and could be much better than Apple’s. 
  • Basic hardware requirements. A lot of WinMo phones are poor performing junk. Can’t there be some licensing restrictions around what minimum spec a WinMo phone need to meet? On the iPhone you know what to expect. On WinMo you have to worry about different resolutions or capabilities plus slew of really slow phones.

When I first started writing this post I had many more complaints. Then I did some digging in the WinMo docs and there a bunch of articles posted about month ago that address those issues.  Like touch gestures.  The developer experience does seem better than 1-2yrs ago. If I would man-up and use the unmanaged APIs, I’d probably feel the SDK was more complete. But I like managed code. Regardless, I think most apps are going to look fairly mediocre until WPF makes it to WinMo.

Building a Better App Store

I think everyone would agree the iPhone app store is fairly successful although most people seem to give credit to Apple for pioneering the concept when Handango was doing that for a long time and across platforms. Poor Handango. Like most things Apple just does the experience better. It also doesn’t hurt that the phone and developer platform are great.

To be successful, obviously you’re going to have to have a few basic features:

  • Support for in-app purchases
  • Reviews only by those that have purchased the application
  • Rankings of some kind
  • 1 – click install. If I see a “Next” button or you ask me a question other than “Are you sure you want to install this” I’m out.
  • Completely stand alone. I don’t want to see any installer on my desktop. Windows Mobile I’m looking in your direction.

Here are the problems I see with Apple’s app store:

  • The slow review process with sometimes illogical rejections not in customers’ best interest
  • Far too many junk apps to wade through to find good ones
  • Categorization like “Productivity” or “Utilities” doesn’t facilitate the best user experience
  • Rankings skewed toward lowered priced items

Every mobile phone is going to have an app store and probably the next biggest, Windows Mobile is launching soon. Based on what’s been announced so far I think Microsoft has some nice innovations already such as:

  • Buying apps charged directly to my phone bill. I’m already paying that. Just tack it on. I really don’t want to associate my Live account with the phone and add a credit card.
  • MobileMe-like backup. Still kills me that I pay for that on the iPhone. I don’t really want to talk about it. It’s even better on WinMo because you actually have the ability to switch carriers and get different model phones.

Here are some concepts I’d like to see them add to make it even better:

  • Curate apps based on personas/lifestyles instead of just categories like “Productivity” or “Utilities”.  Yeah, I want to be more productive. Gotta be an app for that. I think Apple has done a great job of fixing the first problem which is letting people know apps exist via the commercials. My mom wouldn’t know why she needs to install an app until she sees that she can play Bejeweled 24/7 on her phone. The next issue is wading through the apps to find ones beneficial to you and overall rankings.
    • First, you’re already verifying apps and categorizing them all, just tell me the best ones – like an editor’s picks. You’ve seen them all, you probably know better than a person who downloaded one app.
    • Second, “Utilities” is not a productive way to search. I think in terms of “I want to do X, what would help” or “I work on the road a lot, what apps would help me?”  Bucket the apps into lifestyles with suggested best applications – Road Warrior (Where to Eat in Random Small Town USA, Hotel Point Maximizer, Auto-Expense Report 2k10), Soccer Mom (Family calendaring, Find my Kids, Push Notification Us Weekly), Unemployed / Underemployed (Bejeweled). Like a playlist for lifestyle apps. A lifestyle playlist if you will. The suggestions could be a combination of editor’s picks and highest rated. If you want to get crazy have some sort of Slashdot system where reviewers are selected based on karma to curate the lifestyle playlist.
    • Finally, for novice users make a wizard when you start up a new phone - “Hey, if you’re new to Windows Mobile we have a selection of apps, what type of person are you? You’re a PC? We have an app that only costs half as much as the comparable Apple one.” To me it’s fairly obvious how to download apps, but it probably isn’t for everyone. Especially if you’ve never had a “smart phone”. I just gave my grandma a mac and have learned that things I consider intuitive are probably that way because I have spent about 33% of life in front of a computer screen. No way my grandma gets video blackjack installed on her iPhone without a tutorial.
  • Try out some alternative ranking schemes. Not everyone writes reviews, but what if the OS automatically sends back some anonymous feedback around how much each app is used such as frequency and average duration. I’d like to see apps that people buy and use everyday for awhile. Microsoft already has opt-in customer feedback on lots of software.
  • Create separate sections for Verified and Unverified applications. Don’t just reject applications because they don’t meet some undisclosed regulations. Just let all the applications on there. If people want to download something that hasn’t been verified then they on their own. As long as the application compiles and isn’t malware, let it through. You can thoroughly review later and give a seal of approval. This speeds up the app verification process and cuts down on seemingly random rejections.
  • No rejections for providing “duplicate functionality” or “altering the core experience” which Apple likes to toss out for things like dialers. I want to at least try Google Voice. I paid $400 for this phone and about $90 / month to AT&T. Cut me some slack. So what if the carrier doesn’t want VOIP apps? Let them sell Nokia candy bar phones instead and see how business goes. If you really don’t want something like a dialer app on your store, just do what Apple does with iTunes and release a .0.0.1 version upgrade that breaks that app. Developers will learn after the app stops working monthly.
  • Don’t impose developer limitations. It’s ridiculous that Yelp had to sneak in augmented reality. AR is a revolutionary user experience, why hold things like that back? The most innovative apps are going to come from developer’s having freedom to push boundaries. Microsoft is typically good at allowing developer freedom, it’s just that the developer platform is a little weak, but that is for another post.
  • Integration with other devices in Microsoft ecosystem. Apple has done a good job of tying together products like iPhone / Apple TV to iTunes. Microsoft has so many more products that could be amazing if they all worked together a little better.
    • Why limit the app store to mobile? Let people buy windows apps. Cross-sell - Buy Quicken, get the option to add Quicken mobile. Bad example – no one buys quicken anymore.
    • Combine with the XBOX? Xbox media center remote from the WinMo phone is obvious. Or if you buy a game on the XBOX marketplace, include a mini game for the phone. Build a platform for the phones to be part of the game system like picking plays on Madden.  Clearly the iPhone has shown you can have a solid portable gaming device in a phone and Nintendo has done some cool things with DS to Wii connectivity.
    • Zune Pass on the phone? Look, the Zune HD is nice, but standalone media players are dead to me. Slap a dialer on that and let then I'll consider ditching my iLife. One store – music, apps, videos.
    • Even something like Mesh could be integrated better. Most people probably forgot about Mesh. Just make my documents folder sync with my phone so I always have stuff with me. I don’t want to install anything. I plug my phone into my computer and you can just ask  “Hey do you want to be able to always access My Documents from the phone? Yes? Done.” That is not really app store-ish but it’s hard to stop ideating when I get going.
  • Refunds. Give me 24hrs. If the app sucks, I should be able to uninstall an get my money back. I’ll even take a 1 hour window.

That being said. If Microsoft can release some sort of 2nd gen Zune HD w/ a phone and XBOX like portable gaming on a non-AT&T network, I’d probably ditch the iPhone regardless of the app store.