Tuesday, December 18, 2012

App Developers! Users Need Your Help!

F1 key
I have been using Windows 8 since last December, when the Developer Preview was out.  By the time the Consumer Preview was out, I had read all the articles about the (then) Metro design principles, learned how modern apps should be laid out, and about all of the new touch metaphors.  I then designed my app Memorylage, from the ground up, to properly make use of these features, and blend into the whole Windows 8 experience.

The problem?  While I may know and understand all of the new UI interactions for Windows 8; at this early stage, most of my users don't.  And there aren't currently many signs pointing them in the right direction.

A Leap of Faith

In designing the new modern interface for Windows 8, Microsoft made a very important decision early on.  They would create an interface that was as efficient as possible to use, but not as easy as possible to learn.

This is an amazingly large gamble for something as big as Windows, and one that we won’t learn the outcome of for quite a while still.  Can end-users really learn a new interface with no visual indicators?  Do they want to?

Regardless of the answers, the reality is that many new users are using Windows 8 for the first time, and as developers, our apps are one of the first experiences they have with it.  Like it or not, our apps will often be judged for things that we have no control over.

Under-Utilized Features

Here are some of the biggest features that people were missing when using my app.

The Share Charm
share-charm The charm bar is one of the more divisive UI elements in Windows 8, and one of the less obvious for new users to really understand.  They often don’t realize that it is context-sensitive to whatever app you are in, and think it is just for the OS itself.

Looking through usage data from my app, I saw that from the custom collages being created, over 38% of those were saved, but only 1.5% were being shared.  There may be a bit of preference towards saving an image over sharing it directly, but with numbers that drastic, it is obvious that the share charm is not being well utilized.

For those apps using the search or devices charm, be ready for the exact same issue.

Selecting Images
With touch, the way to select an item is to do a cross-swipe, where you swipe perpendicular to the direction of panning.  So if your content scrolls horizontally, you would swipe up or down on an item to select it.  This works great, as it allows you to quickly select or interact with an item, such as tapping to view full-size.

Unfortunately, it is not as obvious to the end user, and since you must select an item before being able to create a custom collage, many people I talked to didn’t find out about this feature, or considered it a “hidden” feature that they found eventually.

It also was not obvious to many that you could select multiple items without any special keys, which you would normally need in a program such as File Explorer.

Semantic Zoom
Semantic zoom is one of the new navigation methapors that Windows 8, and can work really well to quickly jump around through large lists.  And while it may be fairly easy to discover on touch, it is much less obvious for a mouse and keyboard.

Very few people know about the Ctrl/- keyboard shortcut, or to hold Ctrl while scrolling with the mouse wheel.  I use this all the time in my app, and people are always impressed when I show it to them, but for all the people I have shown the app to in person, not a single person has ever found it on their own.
Navigating From the AppBar
The three main functions of Memorylage are to view your photos as a series of dynamic collages, create your own custom collages from selected images, and to use the photo booth function to take new photos for a collage.

Many people find photo booth and the creation of collages to be the biggest strengths of the app, but they are both accessed through the app bar, while you start out in the browsing mode.  Since not everyone opens the appbar, and since the Custom Collage button is disabled until an image is selected, these are more features some people consider “hidden”.

A Gentle Nudge

The first thing I implemented, about a month ago, was a splash screen that displayed on the first run of the app, or after any update.  This helped with a few different issues.  It gave me a place to put a short getting started guide, let users know about new features being added, and gave me a way to get feedback from them through email or social media.  This helped a lot, but is something that a lot of people don’t stop and read when first opening the app.

…provides a much less obtrusive replacement to the MessageBox.Show method we all know and love.

To further help users, I used the Popup control to give helpful tips within the app, at the exact time when someone might want to do those things.  When first navigating to a new folder, it will let the user know about selecting images, and where the Custom Collage button is.  When opening up the Photo Booth section for the first time, it tells them how to use it.  For the share charm, I actually don’t mention it when first going to the Custom Collage page, but immediately after the first time they save a collage.

The Popup control is a great new addition to WinRT, and provides a much less obtrusive replacement to the MessageBox.Show method we all know and love.  In a future post, I will show the code I used to create a static class that closely resembles the MessageBox.Show method, allowing you to simply pass in the text you want to display, an optional heading, and an optional location.  it will then create the Popup control, with its content, and display it.  All in a single line of code.

The last change I made, to further highlight the Custom Collage and Photo Booth sections of the app, was to move those two buttons to a top app bar.  I have noticed that most buttons that navigate to s new section of the app are located in the top appbar, instead of the bottom.  Also, by having the two buttons separated, it highlighted them as well, making them easier to spot.

BandScreenShot
The navigation options in a custom top appbar

Store App Restrictions

It’s not just hidden features that confuse users, but also some of the store app restrictions that don’t apply to the apps people are used to.

One of the most requested features for Memorylage, is the ability to view images outside of the Pictures library.  I have gotten many bad reviews solely due to my apps inability to do just that.  This is of course a basic restriction on apps within the store, but the problem is that the average user doesn't know this.  This was made abundantly clear when I got a scathing 1-star review, saying how the app didn't support the synced SkyDrive folder on the desktop, and therefore wasn't even worth trying.

I ended up writing a short post on the Memorylage website, and made use of the splash screen to point all of my users to it.  Not only did it describe the restrictions the app had, and why it wasn't my fault, it helped inform them about how to fully utilize the Pictures library.  Many people don’t realize that you can add extra locations to it, and all of the files don’t actually have to reside there.  This is especially useful when adding in synced folders from SkyDrive.

Luckily, the user who wrote the 1-star review emailed me as well about the lack of SkyDrive support, and after explaining how it worked, and pointing him to the article, he actually revised his review and gave me 4-stars.

What is Microsoft Doing?

…they want to leave a fun element of “discovery”…

The big question remaining though is what Microsoft is doing to help with this.  I can’t describe the disappointment at seeing their “training” video during a new account creation.  This was supposed to be their way of teaching users the new interface, but it simply shows swiping in from a single side, and moving to a single corner with the mouse.  It doesn’t show what any of the other sides or corners do, or even describe what the first side/corner actually does.

I guess they want to leave a fun element of “discovery” for the user, but from what I have seen of many people trying it on their own; without some guidance from others, “discovery” is something many people will be missing out on.

As more and more people start to use Windows 8, and learn how the various features work, these issues should start to be less frequent. In the mean time though, educating the users is part of the price of getting in early on a brand new eco-system, and is a pretty small one, if you are aware of it.

Saturday, December 1, 2012

Recursive Folder Thumbnails

Thumbnails Everywhere

One of the best new features of WinRT is the thumbnail API.  This allows you to very easily grab thumbnails of any type of item in the file system, such as an image, a song, a folder, or any other file type, and Windows will handle returning a proper thumbnail for it.

For images, this is even more useful, as it will take care of positioning and cropping the image correctly, so that an image of any aspect ratio or rotation can be returned in a standard size.  It always crops towards the top center of an image, as that is where the most important part of an image usually is, especially if it is of a person.  This is actually a very important part of how images in Memorylage are displayed.

Here is a great article about how to use the API for any type of thumbnail: Guidelines for thumbnails (Windows Store Apps)

A Minor Annoyance

For folders, the API will look for a file directly within it, and use that to an appropriate thumbnail, such as an image for an image file, or album art for a song.  The problem is that the file must be directly inside the folder, and not within a sub folder.  If you have a folder with many sub-folders (all containing images), but no files directly inside it, then no thumbnail is returned.

For the initial version of Memorylage, I used the GetThumbnailAsync() method as-is, and just displayed a default image if there wasn’t a thumbnail found.  This worked well enough in most cases, but it always bothered me a little seeing defaults in places that they really weren’t needed.  After seeing it mentioned in reviews of the app, and in emails from people using it, I decided to finally fix it up.

The Code

Fixing this was actually fun, because it was one of the few times outside of a classroom that I actually got to use recursion.  I also made it an extension method, so that it can easily be used in place of GetThumbnailAsync().
 
public static class FolderThumbnailExtensions
{
    public static async Task<StorageItemThumbnail> GetThumbnailRecursiveAsync(this StorageFolder inFolder,
        ThumbnailMode mode, uint thumbWidth, ThumbnailOptions options, bool tryThisFolder = true)
    {
        //try to get the thumbnail directly from the folder
        if (tryThisFolder)
        {
            var thumb = await inFolder.GetThumbnailAsync(mode, thumbWidth, options);
            if (thumb != null)
                return thumb;
        }


        //get the sub-folders of the input folder, and return null if there are none
        var folders = await inFolder.GetFoldersAsync();
        if (folders.Count == 0)
            return null;


        //try to find one with a thumbnail
        foreach (var subFolder in folders)
        {
            var thumb = await subFolder.GetThumbnailAsync(mode, thumbWidth, options);
            if (thumb != null)
                return thumb;
        }


        //if we reached this point, none of the sub-folders had a thumbnail, so call this method
        //recursively for each one until you find one
        foreach (var subFolder in folders)
        {
            var thumb = await subFolder.GetThumbnailRecursiveAsync(mode, thumbWidth, options, false);
            if (thumb != null)
                return thumb;
        }


        return null;
    }
}

Conclusion

WinRT shows a lot of promise, and seems to get a lot of things right.  It is still new though, and has quite a few holes compared to Win32 (as does the XAML side compared to WPF).  In the mean time though, many of the things are easy to implement yourself, and plenty of other people are doing so already.
An excellent example that everyone should check out is the WinRT XAML Toolkit.

Let me know if you have found any others.

Wednesday, October 24, 2012

Windows 8 Doesn’t Want Your App. Try Again Later

[Update 3: And it finally passed certification and is now in the store!  (Oddly enough though, I didn't actually change any code between the last release and this one.)  Thanks to everyone that checked this post out and commented here or elsewhere, and thanks to the people at Microsoft that helped me through a lot of the issues.  While I wrote this to point out the flaws in the overall certification process, and ways it could improve, the individual people that I worked with were always wiling to go out of their way to try and help.  As mentioned below, they already had this escalated it internally before this was posted.]

[Update 2: A lot of people are commenting on various sites about how it is my fault that my app failed, as it was due to problems with my code.  I agree completely, but the point of the article is not that Microsoft failed my app, but that they don't clearly explain why they failed it, which turned me failing once or maybe twice to failing 6 times.]

[Update: I just went to the Microsoft Store this morning to pickup a Surface tablet (so I could test on an ARM computer), and after getting my pre-order slip over the weekend, and being told that they open early at 8, I show up at 7 and am first in line!  At 7:30 though, I overhear that Microsoft sent out an email yesterday saying that they couldn't open the store until their normal time of 10.  I have a job, so I left Surfaceless and un-happy.  #NotHowToLaunchAMajorProduct]

To start, let’s get one thing straight: Microsoft desperately needs apps in its store.  If not only for Windows 8, especially for Windows RT, which can only run apps from there.  It also wants as many apps in there as possible, and has been very active in courting and helping developers to write app for it.  For the most part, I think they have done a great job, as the tools, documentation and examples are excellent.  Where they really fall down though is in the last mile: app submission.

I first submitted my app, Memorylage, to the store on August 29.  Since then, it has failed validation 6 times, and I still don’t know what is causing the failure.  Below, I talk about what I have gone through in the past 10 months, trying to get my app ready, but since it is a little long winded, I have a “Short Version” further down if you want to skip to there. (I won’t blame you)  Also, please subscribe to my blog if you find it interesting.

The Long Version

Getting Ready For Submission

Memorylage has been in development since December, back when there was only the Developer Preview to use.  It was sorely lacking documentation and examples back then, but was enough to get familiar with what is a very different development experience from the Windows of old.  By Consumer Preview, things had improved greatly, especially in the templates, and Memorylage was starting to take shape.

Right around the release of the Release Preview, I attended a 3 day App Excellence lab that Microsoft hosted in their Waltham, MA office.  As this was just a hobby, I had use up my vacation time to go, but it was a great way to get some focused development done, and meet some other developers.  I also won the App X contest at the end, netting me a new Lumia 800 Windows Phone.  Best of all though, I was able to schedule time with a Microsoft Field Engineer, flying in from Redmond, to review my app for early access to the store.

The review involved a 60-point checklist we went though, which checked to make sure that the app met all aspects of their design guidelines, and really showcased how a Windows 8 app was supposed to work.  He also dug deep into the performance and stability of the app, helping me find ways to improve the responsiveness, and give me ideas about how to improve it.  There ended up being 3 issues for me to fix before he would grant me early access (2 of which I knew about before the meeting, but wanted input on), but a few weeks later (July 12th), I had resolved the issues and was granted an early access developer token.

While I had the token, allowing me to submit to the store before almost anyone else, I really wanted to make sure the app was polished and feature complete before submitting, so I kept working on it to get it ready.  I then went to a Hackathon, hosted by Microsoft at the Museum of Science in Boston, on August 18th where I won my second App X competition, netting me a Samsung Series 7 Slate, a $500 gift card and an XBox game.  I also met plenty of people from Microsoft and elsewhere who were really interested in my app, and excited to see it in the store.  They encouraged me to just hurry up and submit it, so I was really feeling good about the possibility of it taking off.

I made up a list of things I felt I need to have ready before submitting, and quickly worked through them, eventually submitting to the store on August 29th.  With only 500 apps in the store, and almost 2 months before general release of Windows 8, I was feeling pretty good about the work I had put into it.  A day later though, I got the first of what would be many failure reports.

Where Things Fall Apart

Memorylage failed a day later for 4 reasons, and with the exception of the 1st, there really wasn’t much insight into what the issue was.
  • Requirement 1.2: The website linked in the app and listing page was not finished
  • Requirement 3.2: The app crashes
  • Requirement 3.8: Performance
  • Requirement 3.10: Failed the Direct 3D test
I was surprised that they actually looked at the web site (I was planning on having it up by the time it made it to the store), but was happy to see that level of detailed review, as I figured it reflected well on the level of end-to-end quality that they were looking for. For the other failures though, I was left with quite a few questions.
  • When does the app crash?
    • At startup?
    • During a certain task?
    • Every time, or randomly?
  • What performance problems are there?
    • Does it startup too slow?
    • Does it suspend too slow?
    • Does a certain action hang or take too long?
  • How did my app fail the Direct 3D test?
    • It is a C#/XAML app that only uses standard controls, and should not have any DirectX requirements.
    • It was submitted as a neutral app, and accepted all DirectX levels
  • Why did none of these failures occur when running the WACK (Windows App Certification Kit) on my own computer?

All of these are pretty basic questions that a developer would need to know to reliably be able to fix the issues that the store is finding. Staying positive though, I took this as an opportunity to really spend a few days doing nothing but polish work on the app. I went through every section and feature, cleaning up and speeding up anything I wasn’t 100% happy with. In the end, I felt confident that the app was truly store-ready, and that my app was better for the whole ordeal. That is, until it failed again for the same reasons! (minus the web site issue)

Bringing In Some Help

After trying a third time, releasing only for x86 (thinking there could be an issue of ARM devices, which developers weren’t able to test at that point), I couldn’t think of anything else to do with the vague results I was getting.  So, I reached out to Bob, a developer evangelist that I met at the Hackathon at the Museum of Science.  He asked me to send him my appx package, so that he and others could look at it themselves. and to post my questions in the support forums.  I did both, and got many suggestions from various people, but everyone was basically just guessing, and telling me to try something and re-submit.  Since access to the store was open by now though, each submission took longer and longer to come back.

One person from the forums who worked at Microsoft actually had his own test store, and asked me to send him my app to run through certification there.  I was excited to have someone looking closely at my app, who could give me a more detailed explanation of what was causing the failure, but no such luck.  The app passed in his store, giving me no insight into the failures in the real store.

test_store

I was then given a link to Microsoft's support site (Windows store developers get two free questions that will be answered by someone at Microsoft, so definitely check it out) and while the person I originally talked to couldn't give me any answers, he escalated the issue to someone on the store team.  It took a few days, but he did get back to me through email, and wrote the following:

Hello Jeffrey, 

I've reviewed this and found out what the concern was. I need you to resubmit the app to make sure that the issue has been resolved. I will be following the process of this submission so that I can verify at which stage the failure should pass. If it does not I will be following up with you to resolve. 

Thank you,
-John

Without any indication as to what the issue actually was, he seems to be saying that it was something on their end, so I resubmitted the app, like he said.

After 6 days of staring at this…

Content Compliance

…it fails with the same three errors.

Making Progress

I eventually get to talk to John on the phone.  He tells me about the little information he can get from others on the store team, and even from some of the server logs used in testing.  He says that it is failing on an ARM machine and a low-powered test computer, due to it crashing, and that because it crashes, the other two tests fail as well (which doesn't make sense to me).  He still can't explain why the app appears to pass all tests in the technical compliance phase, but then fails in the content compliance phase though.  His best advice to me is to try and test on the slowest computer possible, see if I can find any issues, and if that doesn’t work, just re-submit so that he can talk to certain people if it fails again.

Store Failure Report

With the amount of time it took last time to simply fail again, I wanted to try one more time to find out what the issue was before re-submitting.  I was already testing on a slow netbook, as well as an even slower VM, but apparently that wasn't enough.  I then went to my VM settings and crippled it even more.  I lowered to RAM to 1GB, slowed the CPU to roughly 1Ghz, and turned off 2D and 3D acceleration.  Running the app didn't turn up anything new though, as it launched with no issues, and quickly as well.  Thinking that there wasn't anything else I could do, I created a new app package to submit, and ran the WACK (Windows Application Certification Kit) one last time when… BINGO!  It finally failed a test on my computer!

Closer, but Not Quite There

Memorylage failed the WACK for taking 2.46 seconds to suspend, with a limit of only 2.  It also stated that the app used 1.5MB of IO during suspend, which was important, since my suspend code only saves a single string (the standard code from Microsoft for saving navigation history), meaning that there must have been contention trying to suspend while loading a folder.  With this information, I had a fix in under a half hour, but for some reason the store kept hiding it from me in the error reports, keeping me from finding it.

Since I was also had an un-easy feeling that the Microsoft Ad SDK I was using was causing the Direct 3D failure, I took that out as well and re-submitted.  Both the performance and Direct 3D tests did indeed pass this time, but it was still crashing on startup.

While I was heartened to see that 2 of the 3 failures were cleared up, that crashing failure (which I had NEVER seen myself) was starting to feel like it would keep me from ever getting into the store.  After a few days of moping around, I read an article that mentioned that the app store had over 3,600 apps, and Windows 8 was only 3 weeks away from general release.  This pushed to me take one final, and thorough look through ALL of my startup code.

I literally yelled (scaring my wife) when I found the issue staring at me in the very first place I looked.

In the constructor of App.xaml.cs was a call to CurrentAppSimulator.LicenseInformation that was left over from some initial test code I had written (all license code in use was using the correct object).  Since the constructor normally never has any real code in it, and is usually collapsed, I had never looked before to see that it was left.  Remembering that I had read about how calling that object will cause your app to crash when released in the store (but not when using it outside of the store) I knew that this had to be what was causing it to crash in the store every time.  After a little more checking to be sure there wasn’t anything else, I re-submitted to the store, and waited 10 days until… it failed again!

[Edit: I know that it was my fault for missing this line, but it would have been nice if it was caught by the WACK, or at least if the error report told me I missed it.  It was actually listed in the top 5 reasons for failures in the store, so I am not the only one.  Regardless, even after fixing it, it still failed.]

Another Valiant Attempt at Escalation

Ever since my third failure, I had been told by about 3-4 different people that my issue was being escalated internally, and that it should be resolved soon.  This never actually yielded any results for me, but after emailing with Allan yet again (who has done everything he could to try and help), said that it would be escalated to his boss’ boss’ boss’ boss (a corporate VP).  Needless to say, my hopes didn’t get too high.

Conveniently though, I got the failure notice only a few hours before going to a live recording of Dot Net Rocks (probably the most popular podcast on developing with Microsoft’s technologies) on the 17th.  I got there early, and got to meet the hosts, Carl Franklin and Richard Campbell, and even show them my application (I brought the Samsung Slate I had won) and told them about what I had gone through so far.  The guys were awesome, and really sympathetic about my issues, and actually quite mad about how Microsoft was handling things with the store. They said they would try and find someone that could help me out (their international tour was sponsored by Microsoft, and they constantly interview people from the company, so they have connections), but as this was just another promise of escalation, I kept my hopes low.

I emailed them the next day though, just to follow up, and thank them for taking the time to talk to me.  Richard emailed me back the next day saying that he yelled at one of the developer evangelists in New York about what developers are going through, and that hopefully the message would make its way to Steve Sinofsky (the president of the entire Windows division).  He then said that there are thousands of apps stuck in the approval process, which is why it is so backed up.  I didn’t think one more evangelist hearing about it would change anything though (I already had three tying to help me), and thought that would be it.  A few minutes later though, I got another email from Richard saying that he thought about it again, and decided to email Sinofsky himself.

This was definitely more than just a random “escalation”, so I started to get a little more hopeful, and Sinofsky even replied the next morning, saying that they would get back to me directly.  This definitely got me hopeful, but yet again, I seemed to have been let down, as I have not heard anything more from him or anyone else about it. (In Sinofsky’s defense though, he does have a bit of an important launch in a couple days to focus on).


One Last Ongoing Hope

Allan has been keeping me up to date on what he has been doing on his end, and he just had me re-submit my app today, and forwarding me an email from someone saying that they would prioritize my app when it was back in submission.  I still don’t know what was causing the last failure, and I haven’t heard back since, so I doubt I will make it in before launch, but I could be wrong.

Either way though, nothing can the fact that the current approval process is hurting developers, and that is something that Microsoft cannot afford right now.  I have already seen some progress as I have gone through my various submissions, and I am sure that in 6-12 months, none of these issues will exist, but I don’t think Microsoft can afford to wait that long.


The Short Version

What I Did to Get Ready For Submission

  • I started working on Memorylage back in December, with the Developer Preview.  I have been programming for Windows for 17 years, with C# for the last 6, so I wasn’t starting from scratch
  • I read through all of the their design and coding documentation, trying to really create something that showed off Windows 8’s features, and its design style
  • I re-wrote the app for the Consumer Preview when it was released, since a lot had changed, and the new version of Visual Studio wouldn’t even open up files from the Developer Preview anyways
  • I attended a 3-day App Excellence lab at Microsoft’s Waltham MA office, where Memorylage won the App X challenge at the end of it
  • I also setup a meeting with a Microsoft Field Engineer to review my app, so that I could get early access to the store.  This process was extremely detailed, with a 60+ point checklist of criteria that my app needed to meet to get it.  I had three things that I needed to fix when I first met him, but I passed the second time
  • I continued working on the app without actually submitting yet, because I wanted to make sure that it was fully polished and feature complete
  • I signed up for Microsoft’s 30-To-Launch program, which helps developers go through all of the steps necessary to get into the store.  I already had gone through everything that they showed, but I figured it couldn’t hurt anyways, in case there was something new
  • I went to a Microsoft hosted Hackathon at the Museum of Science in Boston, where Memorylage again won the App X challenge at the end.  This time, I netted a $1,200 Samsung Series 7 Slate with dock, a $500 gift card and an XBox game
  • I met several Microsoft people (and others) there that were encouraging me to submit my app to the store immediately, since they thought it was ready, and was something they wanted in the store
  • After another two weeks of polishing, I finally submitted my app on August 29th (almost a full two months before the release of Windows 8)

What Happened After Submission

  • The app failed for 4 reasons, 3 of which gave me no real idea of what caused the failure.  The failures were for stopping responding (when did this happen?), performance (performance of what?), Direct 3D (I don’t use Direct 3D) and having an incomplete web site (I had it finished a day later)
  • I went through all of my code, cleaning up performance anywhere I could, and tried to fix anything that I wasn’t 100% happy with
  • I submitted again, and failed again for the same 3 reasons (minus the web site issue)
  • I emailed Bob, a developer evangelist who I met at the Boston Hackathon, who said that he would escalate the issue internally
  • I re-submitted again, but only for x86, thinking it may be an issue with ARM (since no developers had access to ARM to test with), but it still failed for the same reasons
  • I posted multiple thread in the support forums, asking for help with what I thought was an issue with the startup time (the performance failure) and the Direct 3D failure
  • Matt, who works at Microsoft and replied to the app startup post, asked me to send him my app, so he could test it in his own personal store.  It passed all tests for him though, so I didn’t find out anything new
  • I went to Microsoft’s support site, and used one of my two free help requests to talk to someone directly through chat.  They couldn’t help me, but escalated me to someone on the store team, who would get back to me via email
  • A few days later, I got an email from John, the person my support ticket was escalated to, saying that he thinks everything should be all set now, and to just re-submit.  He never said what he thought was wrong in the first place
  • I resubmit and fail again for the same reasons.  This time, it took 6 days to fail, since everyone had access to the store now.  Each submission was now becoming a lot more costly as the release of Windows 8 was starting to get closer
  • John tells me that the failure is because I submitted a neutral app, which will be tested against ARM, but that can’t be it, because I had already tested as x86 only (the third submission).  He also said that the Direct 3D failure was because I didn’t have a check against the feature level, and not because I used any Direct 3D features.  This was also incorrect, as the documentation clearly states that you only need to check the feature level if using Direct X 10 or up
  • I get to talk to John on the phone, and he tells me that they couldn’t find out much information about my failures (even after pulling server logs), except that the app was apparently crashing during startup on a low-powered machine
  • I cripple my VM, so that it is SUPER slow, and run the WACK (Windows Application Certification Kit), which finally causes it to fail.  The failure is due to taking too long to suspend, and the information it gives allows me to fix it in under a half hour.  Why the store hides this information, and just gives a generic “Performance” error is beyond me
  • I also remove the Microsoft Ad SDK, since I have a feeling that it might be causing the Direct 3D failure
  • I re-submit, and wait another 5 days for it to fail again.  The performance and Direct 3D issues were gone though, so it was just the crashing failure that was left
  • I find that my code has a leftover call to CurrentAppSimulator.LicenseInformation from initial development of the licensing code, and I know that this will cause the app to fail certification, but has no effect when running it on my own (making it very hard to catch) [Edit: I know that it was my fault for missing this line, but it would have been nice if it was caught by the WACK, or if the error report at least told me that I missed it.  It was actually listed in the top 5 reasons for failures in the store, so I am not the only one.  Regardless, even after fixing it, it still failed.]
  • I re-submit, and am hopeful that this will have fixed all of the issues, but after 10 days of waiting, it fails again with the same crashing issue
  • Allan (another developer evangelist that had been helping me a lot) says that he has escalated my issue to his boss’ boss’ boss’ boss (a corporate VP), and will still try to get it through before launch (this is now the 17th of October, 9 days until launch)
  • I meet Carl Franklin and Richard Campbell from Dot Net Rocks, at a live recording in Boston, who I got to show my app to, and tell about my issues.  They say they will try to get someone to help, and initially just talk to some developer evangelist that they meet in New York about it, but Richard then decides to email Steven Sinofsky himself (head of the entire Windows Division) about the issue
  • Also, while at the Dot Net Rocks event, I meet Chris, who ran the App Excellence lab I went to, and he let me test Memorylage on his ARM tablet, and it worked perfectly, so the issues were not ARM based
  • Sinofsky actually responds the next day, saying that they will get back to me directly (I never hear back though)
  • I attend a webcast from Microsoft about common pitfalls of submitting to the store.  The issue of calling the CurrentAppSimulator object is in the top 5 causes of failure, but thry still won’t catch that in any of the tests, or even tell you that was a cause for failure.  The developer is left to figure it out on their own
  • John asks me to send him my app again, so he can look into it again (I haven’t heard back from him yet)
  • Allan tells me that I am on the docket for some critical store meeting, so they are working on it
  • Allan forwards me an email, asking me to re-submit my app, and they will prioritize the certification process
  • I am still waiting to hear back on that (it is now just past midnight on the 25th, with just under 24 hours until launch), but that was only yesterday, so I am actually confident I will hear back soon
  • So far, I have sent/received 131 emails back and forth with various people within Microsoft
  • I have given my app, and even my source code, to multiple people within Microsoft.  To date, not a single one of them has been able to cause it to crash, or fail a single test.  Every issue that I have figured out, I found on my own, but the store still fails it.  How do you debug that?

Store Submission History

Conclusion

What Went Wrong

There are many reasons why my app is still not in the store, and many things that could be improved.  This is just a quick list of the ones I could think of.  Hopefully, people from the store team will see this, and work on improving things.  I have already noticed some improvement between the various submissions, but there is still a long way to go.
  • Failure reports need MORE INFORMATION.  Imagine hitting compile on a large program, and instead of the compiler saying that you missed a semi-colon, and on which line, it waits a week, and then just says that you have a syntax error.  That is what the certification process feels like
  • Do not hide information from the WACK.  If an app fails the suspend test, give the developer that information.  It already creates a detailed report, so just forward that along.
  • If a test fails, especially a performance related one, or a crashing issue, let the developer know what architecture it failed on.  As developers currently can’t test on ARM, letting them know that the app works great on x86 but fails on ARM would be really helpful.  Same with if it passes on a normal machine, but fails on a very low-powered one
  • I still have no idea why the Ad SDK causes the app to fail the Direct 3D test.  Everyone that I talked to says it shouldn’t, as it only uses a web viewer.  If it does have an issue though, then developers should be notified, so they aren’t left guessing
  • Check for use of CurrentAppSimulator in the WACK.  This was one of the top 5 reasons that apps failed validation, so it is a common mistake.  Having the WACK check for it allows developers to find it before they even submit.  At the very least though, tell the developer that it is the cause if it fails.  None of my error reports gave any hints about it
  • When an app fails in the Content Validation phase, where there is an actual person looking at it, they should spend a few minutes giving as detailed a response as possible.  Every response I got was a single sentence that told me nothing.  It may take them a little longer per submission, but if it keeps developers from re-submitting 7 times, it will speed things up overall, and keep developers happier

What I Lost Because of This

Even if my app does get into the store before launch, or very close to it, there are already plenty of things that I have lost, which can’t really be recovered.  Hopefully others have been luckier than me.
  • Almost 2 months of marketing for my app, with very little competition.  When I first submitted my app, there were only 500 apps.  Now there are over 7,000
  • Almost 2 months of development time.  I really couldn’t focus on adding new features when the current ones won’t pass.  When dealing with a new market place like this, development time is precious, and 2 months is a lot
  • Another Samsung Series 7 Slate.  The 30-To-Launch program is giving out a free slate to everyone who registered and got their app in the store before launch.  Even though I submitted 2 months early, with a completed and polished app, I lose out on $1,200 worth of hardware
  • Extra marketing from winning the Boston Hackathon.  Microsoft is offering to highlight Hackathon winners that have made it into the store, but the deadline in next Friday, and even if I make that, I have already lost the time over the past 2 months
  • Downloads and reviews.  If I had been in the store all this time, I would already have built up enough of a reputation to help bring my app higher in the search results, instead of starting from scratch.

In Conclusion

This post went on waaay longer than I planned so I will be brief.

I still think that Windows 8 is a great opportunity for developers, but as it stands, they are in for a world of hurt in trying to get through that last hurdle.  As a long-time Windows developer, I really hope that changes soon.

Also, I want to say that while the overall process may have been negative, every person that I talked to personally was always helpful, and willing to go out of their way to help me (especially Allan), and I don't want to put them in a negative light.  It is just that Microsoft is a large company, and despite their best efforts, things still turned out the way they have.