Why you should still eat your own dog food

I recently read a blog post by Steven Sinofsky (smart guy that I follow on Twitter) in defense of why he didn’t eat his own dog food at Microsoft and while I agree with some of what he said I think he came up short on execution because he didn’t eat the dog food and left their customers and products wanting because of an unwillingness to truly commit to and champion the vision.

Like Steve I love competitors, I respect them immensely, by them having customers I happily acknowledge their intelligence and efforts or if nothing else their dumb ass luck, but regardless they are a competitor and must have done something right to be such. I study my competitors, their product, their evolution, their successes and failures, their choice and use of technology, training, leadership, marketing, their direction, product releases and timing, customer support, everything I can learn about them, but my goal is not to copy what they have done, but to understand the market and our customers. All I really care about is what customers want and or need and so if I’m coming into an existing market then only a fool would ignore the wealth of experience their competitors already have. Even failed competitors can teach you something. While I’m learning about the market you better believe I’m using the competitor’s products, talking to their customers about their product, their x-customers, whoever, but again the focus isn’t their product, it serves merely as a reference point for understanding the market. My objective is simply to become a market and domain expert. Then use that knowledge to formulate what I think the best product is that we can build and what the best path forward is for that product to gather market share. Once I’ve become an expert the need to use a competitor’s product would be briefly at best to see what changes or modification they have made to measure my understanding of them as a competitor and to validate my expertise in the understanding the market. To say that I must keep using their product to keep track of them, would question my knowledge of the market.

I love building commercial apps, competitors and customers, where it is a battle of vision and who has it and who doesn’t and who can improve it. Do I look at competitors as enemies to be vanquished off the face of the planet, not in the least. If they are doing better then me, then I look at them as teachers as clearly, they know something I need to learn. If I’m doing better then them, then they are my motivation to constantly improve, and I get pissed if they quit pushing me. In the end I believe deeply in having competitors as it fuels the drive for the best possible product in the least amount of time and that is ultimately what the market wants and deserves.

There were lots of things I didn’t like about Steve Jobs, but certainly there were things to admire about him. His expertise and commitment to his vision of what customers wanted despite what other companies were doing was admirable, but also endorsed by the fact he was right and dominated the phone and tablet markets (proof is always in the pudding, lots of people have a dedicated vision that results in disaster, but we tend to call those obsessions). You didn’t see Steve Jobs using a Windows Phone, or even a Windows laptop as he felt they were beneath his vision and lacked soul. He didn’t feel a need to track what his competitors were doing, to be honest I doubt he even cared as he believed in his expertise and vision and that was all that needed to be championed. This isn’t about not liking someone else’s product, it is about constantly driving improvements and confidence in your product. When you admire someone else’s product, you are really admiring their vison and that is fine, lots of very smart folks out there, but your job is your product’s vision. Have you ever seen Tim Cook use a Surface, Android phone, fit bit, etc? Any Google Executives using an iPhone or Bing? Image does matter both to the market and your employees, but most importantly if their product doesn’t work for them, they fear that also doesn’t work for their customers and that pain point helps drive improvement. You are a phone developer and get a call that the CEO’s phone just ate his data, you are on that like white on rice, but you’re also impressed he is using it.

I believe in eating your own dog food. If your product isn’t working, has awkward flow or anything else that makes you feel uncomfortable, then you should feel uncomfortable until you fix it. If you can simply switch to a competitor’s product, then you lose that motivation to really drive improvement in your product. It is vitally important for your market to see you using your product, especially if its a new product as it helps them feel confident that you are also experiencing their frustrations while using your product and you are not only motivated to fix them but that you are confident in and committed to the product long term.  You have put your skin in the game, and you have something to lose just like your customers, but more importantly you validate their belief in your product and it’s future.  When you use a competitor’s product what you are really saying is “our product might be pretty good, but its not as good as the competitor’s product that I’m currently using otherwise why wouldn’t I use our product”. 

You don’t get to control the customer’s perception, certainly you try to influence it in a product positive way, but customers perceived Microsoft management using competing products not as market research (which should have been finished long before the Windows Phone was released), but as an admission that the competitor was still better.  Why should they use the less desirable product?  You wouldn’t use it, why should they?  Eat the dog food, make the commitment to your customers. 

I’ll admit in the case of the Windows Phone it had some problems coming out of the gate, but so did the other guys.  UWP was moonshot and development tools and API’s for example weren’t ready for prime time at the release of the phone, but UWP was a great idea and I love now being able to use tools and code I know on everything from simple IoT Devices to Augmented Reality Headsets and everything in between.  I think Microsoft’s shareholders were far to short sighted to see the vision and Mobile paid for that and the repercussions are going to last a long time (most apps are run on mobile devices and the problem isn’t just not having the apps or developers, its having access to the data the apps create and use to drive things like Machine Learning, not being in the mobile space is going to hurt).

Now I’ll admit I’ve never had the chance to run something as ambitious or complex as building a new OS and hardware for a company where software was pretty much a cut in stone religion, but I have experience with several successful start-up companies. Including one where we were the new kid on the block but within a year we were the 800lb Gorilla with a market cap of almost 2 Billion dollars because we nailed the vision and executed and delivered the product that the market wanted. Did I know my competitors and their products, I knew them intimately and because they were such very good teachers they helped me become a domain and market expert. Our vision and product was significantly different then theirs and ultimately more in line with what the market really wanted.  Which product would I use, ours of course, it does what I need and in a way that makes sense, and does it consistently without surprises and is committed to a long future of innovation and improvements, why would I want to use anything else?  I enjoyed that dog food, we worked hard to make nutritional and great tasting and far better for our customers then our competitors did.  Too bad I can’t say the company lasted long after I left to go do another company, I’m always looking to learn new things, it is what makes life interesting.


Release of Winner Winner App

Always fun releasing apps and especially so for apps you designed and built as something you need.  I do a number of presentation every year and handing out door prizes at the end tends to be a bit of a confused scramble and not the cherry on the top of a great presentation that I’d like.  So I needed something better, something easier, faster, more engaging, something smooth and professional, but I couldn’t find an app that worked for me, so being a Windows software developer I wrote my own.  May I present Winner Winner the easiest and fastest way to let people enter and win prizes that runs on a number of Windows 10 devices including desktop, tablets, phones, hub and even the HoloLens. Everyone carries or wears an electronic device with Bluetooth, so let that be their entry into your raffles or door prizes. No more hassles with lists, paper or tickets, as with Winner Winner you can quickly and easily have people enter your draws anywhere. Just have them put their Bluetooth device in discovery mode and Winner Winner will discover and enter them and even randomly select the winners. Want to limit the entries to only certain types of devices, no problem as Winner Winner can filter devices to only those you want. Winner Winner has addition features and controls will make your contests even easier and more successful and that’s what we call a Winner Winner.  You can see a brief overview of Winner Winner here

If you have been to one of my recent presentations then you have seen Winner Winner in action and seen how fast and easy it handled entering contestants and handing out prizes.  You can download Winner Winner for free here in the Microsoft App Store.

Confessions of an app store developer - One App One Month

After spending the last four or five years building and coding hardware devices and becoming an IoT expert, its time for a new challenge and a return to designing and building apps for users again. I first started writing code in the late 1970’s in FORTRAN on punch cards and over the years I’ve made a living from Shareware and creating my own Software companies which helped me learn a lot about users and business and prepared me for doing Startup companies and despite the success of creating almost a billion dollars worth of companies, I didn’t enjoy it as clearly the emphasis is on making money and not much else and its often a Survivor like game when the money hits the table which was enough to end my involvement in start-ups.

I love creating stuff, and the process of taking an idea to a finished product in the hands of users, is my thrill, so after spending years building IoT devices I wanted to get back to pure software again. I decided after looking at Windows 10, and the rapidly maturing UWP (Universal Windows Platform) and development tools (Visual Studio 2015 and beyond), that writing apps for the Microsoft App Store would be an interesting, toss in that I really love my Windows Phone (currently a Lumia 950XL) that building UWP apps which have a phone slant would be worthy and fun adventure and just be a great learning adventure.

Now I’ve been a Microsoft MVP winner for 13 years and in a number of different areas over the years as my interests change, so this year I’m ‘Visual Studio and Development Technologies’. NOTE I’m not a Microsoft employee, nor does Microsoft tell me what to do (other then my wife not many people do), but I’m awarded my MVP usually because I spend a lot of time giving presentations to various user groups, or teaching, or just sharing my knowledge and experiences with others as I’m a huge believer in the power of developer communities, and its for that purpose that I’m writing this blog entry.

One of the challenges I had when considering building apps for any app store is the lack of information as to what to expect as an app developer and in particular how much money do they make. I’m not particularly motivated by money, but I understand that you need money to live, to pay for a roof over your head and put food on your table and such. I’m not interested in driving a Lamborghini, but I am interested in making a reasonable living which is likely less then what some people consider making a living as I’m trend to live a more minimalistic lifestyle to reduce the amount of control that stuff has on me. The question is, how much money does a person need to make and can you do that as an app store developer? I can’t tell you how much money you need to make as it has been my experience that everyone is different, but I will tell you about how much money my first app has made in its first month and share some of my experiences and learning thus far.

Some important points concerning this first and please read these so you understand what I’m doing and what my objectives are.

  • In Calgary, we are currently around 10.3% unemployment and office space vacancy downtown is about 30% as the collapse of the petroleum business has hit hard and so some folks are scrambling to find alternate employment. So my first objective is to see if it is possible to make a living from or a reasonable income supplement or at least a self sustain hobby writing apps for the App Store.
  • The IT industry is very discriminatory and so a lot of qualified and capable people are without suitable employment for all the wrong reasons, could be gender, could be race, could be age, education or whatever, but in my experience of writing Shareware or apps for other app stores, users don’t discriminate, they just want quality software that does something they want done, or something that otherwise they like. An App Store is a great equalizer where as long as you don’t name your company something inflammatory, it comes down to who makes the customer happy and not much else other then some basic business skills.
  • There are other App Stores, but I’m only interested in Microsoft’s App Store so my focus is apps written using UWP just for Microsoft’s Windows 10 App Store. Reasons for this are both personal (I’ve been writing Windows code since 1990 and to paraphrase Roberto Clemente, Windows has been very good to me). I also believe that Microsoft is onto something with its Universal Windows Platform as it’s a logical extension to the concept of cross platform languages as it enables cross device development where I can write the same code and using Adaptive Display have it run on different devices and be able to take advantages of each device’s capabilities. Not only is this a powerful development tool, but will also simplify future maintenance which is very important to an Independent Software Vendor (ISV) as there are only so many hours in a day.
  • Microsoft seems to be working a long plan that the other platform vendors aren’t and that plan seems to be coming together (they still have some work in the mobile side, but they are making good progress but quietly). The platform, tools, devices, are all making great strides, and if they juice the App Store like they have Groove (and it appears they are), then jumping on to this now might be just good business timing.
  • I’ve been impressed with the user community and while it might be small they seem willing to support app developers and that is very important.
  • I want to write at least four apps in different areas in order to build up some expertise and hence be able to evaluate the concept as being viable or not or how to make it viable as I’m not a believer that one app does an expert make (there are some in IT who think reading one article makes you an expert).

First App, First Month

As the idea man behind a number of companies I have lots of ideas for apps, but I chose the Weather Barometer app as my first app as I wanted something simple where I could focus on the processes and such of getting an app into the store and my Pioneer Farmer Grandfather left me with a love of Barometers. Reading tips from other developers like Atley Hunter I also wanted to focus a bit on features which help build a developer user relationship like feedback. I also wanted to try HockeyApp for beta testing so the app took three months to write (not full time), so I could explore some different features and such and this is time while spent as every app I write will have features and such that I researched and built during this time.

wp_ss_20161119_0004

There were a number of things that I tried and certainly Template10 was a huge find as it gave me an excellent UWP foundation to build on and with the Template10 courses on Microsoft Virtual Academy I was very confident in using Template10 as my starting point.

HockeyApp I liked and I’ll talk more about why you should use HockeyApp below but my first impressions were its very useful for testing but still has some work to do for Phone Apps. For example deploying an app to my beta testers could be problematic if the app was using components/dependencies my testers didn’t already have installed as sending out the .appx file made the app installable by clicking on it, it didn’t install any of the dependencies, so I lost a few testers because of this complexity. If I deploy everything to my testers then they had to install a zip extractor and then work their way through the .appx files to install everything including the dependencies. I did find HockeyApp to be useful for finding problems during beta testing and will use it again and especially that I believe that they are constantly improving it and are addressing some of the issues I ran into.

Initial Release

Once I had completed beta testing the submission and release process is pretty straight forward and my app hit the store for download on Nov 2nd which was good as I was attending a MVP Summit Meeting at Microsoft starting on Nov 4th. I had included a way for user to email me suggestions, comments etc which some users used to send me messages about the units not displaying correctly. I had some code in the app which was supposed to check the user’s region/language setting and return if they used Metric or Imperial units and while I tested this for Canada and the USA, but it didn’t work for some countries/regions in Europe for example. I posted the problem in the developer forums and Microsoft jumped on it and are working on a fix for some language/regions where IsMetric doesn’t return the correct measurement units. That said however I had some users send me some feedback explaining cases where they might want to use the other units, so I planned to add the ability to select the measurement units in the app settings in the next release.

The other comment that I heard from a number of users was they didn’t like the ad banner. As I mentioned the idea of these app is to see if a developer could make a living doing this so I started with monetization via ad banners, which are pretty much trivial to add to your app and manage, so it allowed me to give the app away for free and yet hopefully make a small revenue stream. Users were ready, willing and wanting to ‘buy’ the app so they wouldn’t have to look at advertising.

Post mainscreen with ad

The other comment I heard fairly often was around updating the Live Tile which I thought was interesting as users really like that so upon returning from the MVP Summit I had an update to work on which included adding unit of measure preference to settings, In App Purchase of an ad free version, updating the Live Tile, using Feedback Hub and a small bug fix as when a user changes their font size it can change the screen width and/or height and messed up my adaptive display for rotating the screen.

Coding the Update

One thing that I should mention is Microsoft has made In App Purchases very easy to code and manage, but testing it is a bit of fuzzy area. Now there are two options for in app purchases in terms of what library you use, one library is old and in the process of being depreciated and the other new. I choose the new library as while it requires at least the Anniversary Update I could tell looking at my Store Reports that most of my users were running the Anniversary Update so it wouldn’t be much of a problem. The old library had better testing as it allowed you to connect to a ‘test’ store where you could test having, not having made the purchase etc, but the new version is pretty much a black and white affair so I tested all sorts of negative conditions first like no network access to the store etc, not purchased, canceled purchase etc as once you have purchased the ad in, its yours and the there is no going back to not having the purchase so plan your testing accordingly. I also created a testing Add-on just for testing so I could test an actual purchase of the no ads Add-On once it had gone live in the store.  The store process for the user is pretty good as once they select to purchase the Add-On in the app, they are taken to the store where they have to login and then approve the purchase and then the Add-On works immediately so they can be fairly confident that they are ultimately in control of the purchase process and get their purchased Add-On immediately.

wp_ss_20161118_0001

Live Tiles and toast messages are also fairly simple and I’d highly recommend using the UWP Community Toolkit as it made this fairly simple. The UWP Community Toolkit should be in front and center in your toolbox as its full of coder goodness and will save you many hours of coding and testing as its intent is make your apps better and your life easier, what's not to like about that?

wp_ss_20161118_0002

 

Releasing the Update

Again the store is pretty good for submitting and releasing your apps, but in my case my store reported crashes went up immediately which wasn’t good (the Developer Dashboard for the store gives you access to lots of reports so you can track how your application is doing). Looking at the crash data reported in the store I could see that the crash was happening in some countries but not others but I wasn’t getting enough information to figure out the cause of the crash, enter HockeyApp and some great users to the rescue. I built a version of the app using HockeyApp and then made the it available to some users who were having the problem and didn’t mind running the HockeyApp version which returned crash data to me immediately and from the stack I could see where in the code it was blowing up and with a little testing I found the exact cause of the crash, so now I could start on a fix. I sent the issue to Microsoft as if you called DateTimeFormatter.Format(DateTimeOffset.MaxValue) (which gives you a localized date time string) with some language/region combination, it would crash. I looked at the one case where because of threading I might pass a DateTimeOffse.MaxValue to the DateTimeFormatter.Format and determined that a correction for that which removed the problem from my app.

Releasing the Fix

Again the release process went very well and I took advantage of a store feature for promotions where you can generate free promo codes for apps and add-ons so that I could send those users who helped me find this bug a free add-on to remove the ads from their app, which was the right thing to do and again the promo codes were easy to generate and use so points again to the store there.

The Numbers

Downloads

clip_image002

You can certainly see the value of being mentioned on AppRaisin and WindowsCentral so when you release an app don’t forget to let the news sites know about it. So other then the opening rush, I’m seeing about 35 downloads a day, which isn’t a lot but really this doesn’t have a large market size as its Windows Mobile 10 and only for Lumia 950 and 950XL phones as they are the only ones with a barometer sensor so I wasn’t expecting huge download numbers.

Revenue

clip_image004

As you can see from the initial flat line, this app wasn’t making much from ads, but once the option to purchase an ad free version was released, revenue improved. This app made approximately $34.89 CAD for the month of November where about $1.48 CAD was from advertising and the rest $33.41 CAD was from users buying the ad free option over the last eight days of the month. So clearly, I should have had the ad free option available from the start, but the ad free option is generating about $4 CAD a day, which is more then I expected as I my target was about $3 a day so I’m happy.

Conclusions

For the first month, I’ve learned a ton and my revenue targets were passed by about 20% so I’d have to call this a good start. I’m currently working on another app and then once its released I’m thinking about going back and adding languages to this app to see what impact that will have. Currently this app is in 242 markets which are English only but available in a lot of countries and I see a lot of downloads in foreign countries so adding support for those countries likely makes sense and I have had users offer to help me with the translation, so once again Windows Phone users show that they are just a better class of user. I suspect that downloads and purchases will tail off in the future as there are only so many 950 and 950XL’s out there, but perhaps in the future someone will release a new Windows Phone which features a barometer sensor, or perhaps a Surface or other devices will a barometer, in which case it would be simple to support those with this app.

I do have a bunch more features that I want to add to this app which is good as it will help to keep the app fresh, so I’ll work on those as I get time between other apps that I’m writing, but otherwise I’m happy with the progress thus far and working on my next app which will work on a few more devices then just the phone and should be quite unique.

Metric or Imperial–what Windows 10 Mobile setting defines what is shown?

With the release of my Weather Barometer app I received a lot of feedback and questions around incorrect measurement units, so I thought I would put together a blog post about this as it’s a little more ‘interesting’ then one would expect.  Weather Barometer uses meters or feet for elevation and hectopascal (hPa which are the same as millibars) or inches Mercury (inHg) for barometric pressure.  The hectopascal is the international metric unit for measuring atmospheric or barometric pressure. One hectopascal is exactly equal to one millibar, and although the scientific community has officially adopted the hectopascal in preference to the millibar, the millibar is still used extensively throughout the world due to the proliferation of its use historically.  So we are using accepted measurement units, but the question is why don’t I see the unit of measurement I expect.

First let me describe the code that is responsible for displaying the units.  The native Windows GPS units are metric, so if we are going to display GPS elevation in metric then we don’t need to do anything, but if we want to display elevation in feet, however, then we need to convert the native GPS meters to feet; for that we use a Converter.

public sealed class ElevationValueToStringConverter : IValueConverter
    {
        public object ConvertBack(object value, Type targetType,
            object parameter, string language)
        {
            throw new NotImplementedException("Converting from string is not supported.");
            //return value;
        }

        public object Convert(object value, Type targetType,
            object parameter, string language)
        {
            double x;
            try
            {
                x = (double)value;
                if (Double.IsNaN(x))
                {
                    return "";
                }
            }
            catch (Exception)
            {

                return "";
            }

            if (RegionInfo.CurrentRegion.IsMetric)
            {
                return x.ToString("F0");
            }
            else
            {
                return (x * 3.2808).ToString("F0");
            }
        }
    }

NOTE the line RegionInfo.CurrentRegion.IsMetric is responsible for querying the system to see what units the user has selected.  The Microsoft documentation for this is here https://msdn.microsoft.com/en-us/library/system.globalization.regioninfo.ismetric(v=vs.110).aspx and states RegionInfo.IsMetric gets a value indicating whether the country/region uses the metric system for measurements, but why are we using ‘RegionInfo.CurrentRegion’, looking at the Microsoft documentation for this here https://msdn.microsoft.com/en-us/library/system.globalization.regioninfo.currentregion(v=vs.110).aspx we see that it gets the RegionInfo that represents the country/region used by the current thread, ie the Weather Barometer thread, so it should be returning a true or false concerning if the user’s region uses metric measurements or not.

The Windows Phone barometer sensor also returns pressures in metric so we have similar code for displaying pressure where 0.0295299830714 is the conversion factor for converting hPa to inHg.  I should mention that Converters are a cool and handy programming feature in UWP.

public sealed class PressureValueToStringConverter : IValueConverter
{
    public object ConvertBack(object value, Type targetType,
        object parameter, string language)
    {
        throw new NotImplementedException("Converting from string is not supported.");
        //return value;
    }

    public object Convert(object value, Type targetType,
        object parameter, string language)
    {
        double x;
        try
        {
            x = (double)value;
            if (Double.IsNaN(x))
            {
                return "";
            }
        }
        catch (Exception)
        {

            return "";
        }


        if (RegionInfo.CurrentRegion.IsMetric)
        {
            return (x).ToString("F2");
        }
        else
        {
            return (x*0.0295299830714).ToString("F2");
        }
    }
}

So now we know how the code works, how do the settings work to display the data in the units we want to see?  In the Windows Phone Settings there is ‘Time & Language’ which allows you to set ‘Speech, region, keyboard’.

wp_ss_20161103_0001

If we open that we see ‘Date & Time’, ‘Language’, ‘Region’, ‘Keyboard’ and ‘Speech’.

wp_ss_20161103_0002

Now I think that most people believe that unit of measure are controlled by the Region settings, which makes sense given that for most countries the units of measure mandated by the government.  Looking at the Region Settings we see we can change what Country/Region we are in by changing the selected country, so for example one would think that if the Country/Region is say set to ‘Canada’

wp_ss_20161103_0003

then metric units of measure would be used, whereas if we switch that to ‘United States’ that the phone would switch to using imperial given the United States uses the imperial system.  So first a screen shot of the Weather Barometer with Region set to Canada showing metric unit usage:

wp_ss_20161103_0005

Now if we change the Region to ‘United States’ and restart the phone as required,

wp_ss_20161103_0006

we see it is still displaying Metric units in the Weather Barometer.

wp_ss_20161103_0007

Now this isn’t what most people probably expected, so what is it that controls which units are used, if it’s not the Region setting?  If we switch the Region back to ‘Canada’, restart the phone to get back to our ‘all Canada settings’ and go into ‘LANGUAGE’ we see that I have ‘English (Canada)’ as the top listed language which makes it the active language.

wp_ss_20161103_00041

If we tap and hold our finger on ‘English (United States)’ such that the popup menu appears and then select ‘Move up’ until it is at the top of the list

wp_ss_20161103_0009

and then restart as required to make ‘English (United States)’ the active language and, when we run the Weather Barometer we see that the units used are now imperial. 

wp_ss_20161103_0010

So it’s the language setting which determines which units are used.  This might be confusing or counter-intuitive but it is how Microsoft set it up. I was thinking about this and I think it might because there is a country (or countries) that use different units of measure in different regions, and which might have different languages. Microsoft might have connected units to country/languages to accommodate this.  I don’t know of any countries where this is the case, but I can’t claim to be an expert on the topic.  Now remember on the REGION screen for Regional format we were using the default setting of ‘Match phone language’,

wp_ss_20161103_0006

what would happen if we changed that to say ‘English (Canada)’ and did a restart, leaving our active language as ‘English (United States)’?

wp_ss_20161103_0012

If we now run Weather Barometer the units are still shown in imperial,

wp_ss_20161103_0013

so clearly Language controls what units the system uses.

I hope this helps you understand how the Regions/Language setting determines whether your phone is using Metric or Imperial units. I would agree that it seems a little confusing and counter-intuitive, but I’m sure Microsoft has reasons why it is set up this way I’m still considering not using the system unit setting, however, and making it an application setting to make it easy for users to set and get the units they want.

As a follow up I have tested some language settings which should return metric but don’t, so I’m following up with Microsoft to see if its something I need to fix, a setting I’m missing or something else.  I’ll post as I get information.