Moving on ...

My experience with blogspot has not been pleasant so far. I have found the interface and the final page rendered broken many times. If I write just paragraphs of text, maybe that works fine. But in a technical blog where there is code and links and various other formats, blogspot fails miserably. I find the themes and other user interface oriented stuff within blogger crappy. Yes, you can edit the template but neither do I have the time nor interest in that.

Google should have improved blogger to really compete with other platforms - WordPress, Ghost etc. Blogspot, obviously, is not of high interest for Google.

Overall, I am not happy with the product. I will be (have already!) no more writing here on this blog. Will be continue to post at http://vivekragunathan.wordpress.com. See you there!

A-Team Library !!!

A short while ago, I had to write a compelling document for a client about a library that I had developed during my tenure, call it A-Team Library or ATL. Having to learn the "eyes-wide-shut" culture to maintain the couples-of-decades old code and simultaneously develop on the top of it was very disheartening. It was time a lot of things were given fresh thoughts. Not the least of all duplication of code and functionality. But not just that. Like in a programming language, when there is more than one way of doing something, when those ways are opposing, it causes nothing but confusion. So was the case. The business seemed to be far from realizing it.Instead of showcasing the issues that were being faced and yet not realized, let me state the alternate - how things in such cases can be better:
  • Business has to realize or let known: When the engineering team accepts the authority of the business in deciding the priority of features, the business has to be prudent enough and trust the recommendations of the engineering team. Business has to shed off the old-school thoughts and educate itself that things like refactoring, redesigning etc. have an effective customer value.
  • Promote collaborative development - Huddle with fellow developers, Discuss and validate one's ideas
  • Think twice before investing time/effort in churning code. It is easy and usual to think that it is one's own invention!
  • Resist the temptation to modify code without consulting its author, even when there is a bug.
  • Someone once told me a quote- If you are writing code the way you were writing 10 years ago, you should probably change your profession. Developers should keep a constant watch on the way they write code and the way they think about solving problems. Meta-thinking! A good tool to aid meta-thinking is a hammer :)
  • First there was Waterfall, and then came Agile. Agile is not a silver bullet. It is us who has to be agile, and know what we have to be Agile about.
  • Was it Waterfall's fault? Is it even a living thing? We always need something to follow to establish discipline, and when we fail, we blame the inanimate. Sooner or later it will happen to Agile too. In the end, we have to blame ourselves, and not any methodology, for what we did not do.
Of course, none of this can be reasoned across the table without winning bureaucracy! On the other hand, documenting it would be a better approach. The document would be a mind voice. I was diligent to focus on the issues(s) rather than the person(s). Generally speaking, the issues are commonly occurring although their flavor would differ from case to case. Among the several issues that were making our jobs mundane and tedious, I narrated top 10 in the document - introduce the issue, its effects, solution, how it can abstracted for reuse and reliability, how my library solves them and yields actual business value etc.

In that document, towards the epilogue, I had to persuade the intended client audience to realize that such issues existed in the system, establish discipline and accountability, and develop a culture of solving the issues with a holistic mindset. In a way, I had to implore the desired audience, at a philosophical level, emotional level. That climactic "court room like" dialogue is what this post showcases: A-Team Library.

ATL was a bag of things - lot of classes, functions, scripts, utilities, techniques and practices, which when adopted as a (company) standard and managed with discipline guaranteed effective business value (time/effort/cost). Besides saving developer time for better use and increasing the reliability of the code, it would eliminate the mundane testing, not necessarily manual, and pave way for automating the scenarios(regress and beyond), which eventually provides confidence to release the final product when new features/changes are introduced - a value that the business wishes to have and demands!

The Secret behind Bjarne and Herb's Papers on Unified Call Syntax !!!

A long time back, in one of my posts here, I had discussed about Extension Methods ... in C++; sorta! It seems that the grand daddy, Bjarne Stroustoup, had read my post, and was impressed. So he has published a paper - Call syntax: x.f(y) vs. f(x,y). Good thing except I don't like the idea of assuming x.f(y) for f(x, y) while the reverse is the actual idea of extension methods. You will know when you read his paper. It seems the commander, Herb Sutter, also was impressed with my post. Not only that he too doesn't seem to like the x.f(y) for f(x, y) idea. Great men think alike. LOL! So he published his paper - Unified Syntax. How is that?

Needless to say, I was completely kidding about the Herb and Bjarne about borrowing the idea of extension methods from my post. I wasn't even born when Bjarne invented C++. The papers are detailed and deep in considering various scenarios from a language standard perspective unlike my post where I just spotted the existing but unrealized possibility of the feature in C++.

While C++ produces awesome languages with superior and modern syntax, constructs and concepts, it takes a long time to do that for itself. That is a sad thing! Nevertheless, I am proud that I know and love C++.

A Simple Tree List View !!!

Digging up stash is one of the best pass times. You know you never know what you will find. I had an article written quite some time back but had not posted it anywhere. Not sure why. I posted it at CodeProject - A Simple Tree List View.

PHP Savers - PropertyBag !!!

The ubiquitous and the universal data structure in PHP is the array. It is an amalgamation of commonly used data structures - list, map etc. In the recent times, PHP has also adopted object orientation and introduced classes. The syntactic difference in the way a property of an array and object poses an inconvenience in the user code1 specifically when there is a need to interact with code that is not open for change; legacy or not.

JavaScript would allow you to access an object property either obj.propName or obj["propName"]. That does come in handy for sure. Besides, accessing the property by [] tags is the only way if the property name contains characters like hyphen: obj["prop-Name"]. At the user code level, it is fair to see an object as a bag of key-value pairs.

Along the same lines, it is not wrong to expect the same in PHP between an object and an array; although there is a fundamental difference2. The expectation arises when there is a lot of code that generates array (as output), and a lot of code that expects object (as input), or vice versa. Either code would primarily be interested in the getting or setting the properties/keys than the intrinsic. For that matter, the reasoning behind why an array or object was chosen by the author of either code is outside the scope of this post.

When the intent of the user code is to get/set the property or key, the syntax is just an inconvenience that gets in the way. Here is how one would access a property, or key precisely, of an array:

$arr["key"]    or    $arr[$key]

Here is how one would access a property of an object:

$obj->key    or    $obj->$key

To cope with the impedance mismatch between the code that generates an array and the code that expects an object (or vice versa), one is cast into another:

$obj = (object) $arr;    or    $arr = (array) $obj;

Of course, such casting has documented limitations. The restrictions would still apply to any solution trying to address the impedance mismatch problem.

In PHP, arrays are a bit funny to deal with. If one has programmed in other managed environments, it is evident that arrays are reference types. In PHP, arrays are value types; or sort of2. In other words, when you assign an array $a to $b, then $a is copied to $b. It makes perfect sense if one wants to make a copy of the array. If the array needs to be passed over several functions for read only or update purposes, it does not make sense to make copies over and over. We can reference the array:

$b =& $a;

An object in PHP - an instance of a class or stdClass, on the other hand, is a reference type (Thank God :)). Here the point is to avoid unnecessary copies of arrays and objects (created when casting from an array) that are created for merely accessing the properties.

That's where PropertyBag comes to the rescue. PropertyBag is an extremely useful class that can wrap over an object or an array (without creating a copy) or even create one from scratch, and make it possible to access the properties, or keys, either as an array or as an object, depending on the user code. Wherever one would return an array (or an object), an instance of PropertyBag could be returned without the need to change the code that consumes this return value. The caveat here is the consumer code does not make explicit type checks or something of the sort. You can grab your copy of PropertyBag from github:php-savers or read the excerpt of the class here below.

PropertyBag primarily helps to work with array or objects seamlessly, using either the array or the object syntax to access the properties. It also helps avoid creating copies of array when it is passed across functions2.

<?
 
abstract class PropertyBag implements ArrayAccess {
    protected $_store = null;
    protected $_readOnly = false;
 
    protected function __construct(&$source, $readOnly = false);
 
    public static function fromArray(array &$source, $readOnly = false);
    public static function fromObject(&$source, $readOnly = false);
 
    public function isReadOnly();
    public function __get($name);
    public function __set($name, $value);
}
 
class ArrayBasedPropertyBag extends PropertyBag {
    public function __construct(array &$source = null, $readOnly = false);
 
    #region ArrayAccess Interface Implementation
    ...
    #endregion
}
 
class ObjectBasedPropertyBag extends PropertyBag {
    public function __construct(&$source = null, $readOnly = false);
 
    #region ArrayAccess Interface Implementation
    ...
    #endregion
}



Appendix
  1. The code that I am working on is massive and consists of code several years old, a few years in the past and newly written. One can see the characteristics of the code change among the code from different periods. The newly written code, I believe is written with a great level of consciousness and awareness,  interacts with old code (give and take) passing in or taking arrays or objects. In no case, the old code could be changed to adapt what the new code is expecting or returning. Besides, the new code attempts its best to avoid copies of entities by leaning on object types whenever there is a chance instead of plain arrays. So there was an inherent need to build/work with something, an intelligent entity, that would bridge the gap among the code from different periods. The friction here was primarily the syntax difference in accessing the data rather than the intrinsic or nature of the data structure. Hence PropertyBag.
  2. Arrays in PHP are inherently value types but they disguise as reference types until a write is attempted. That means, array variables when passed across functions tend to avoid copies but the moment it is tampered (or written to), a copy of the array is made; copy-on-write. In most cases, a copy is not what is required. Instead the original array is intended to be updated. In cases where a copy is intended, making it explicit via clone mechanism is a good practice. PropertyBag will avoid copies of the array, and will also be able to hand out a copy when required through the toArray method.

Cool Regex Testers !!!

Anytime I have to play with regular expressions, I use one of the online regex testing web sites to come up with the regex I need. Last couple of times I had to come up with a regex for most common everyday stuff like dates and such. Oh yeah, last time it was date actually. I had a server response that had a date in the format yyyy-mm-dd, ISO format. I was working with JavaScript, and initially I was naive to use the Date class to parse the date in the response. Turned that there is difference in the way the date is interpreted by Firefox and other browsers.

Ok, this is not a rant post about the Date class but actually share some sites that help you with regular expressions, of course at different levels. Here is a list of such sites:


In the above list, I like the last but not the least - freeformatter.com. The cool thing about freeformatter is that it lists a lot of commonly used patterns such as emails, ip address etc. And I was lucky to find the ISO date pattern too, which saved me time. The uncool thing about it though, unlike other sites, is not haptic to the regex or input you type; instead requires an old-style submit button click to validate your expressions, and also does not show the matches (or capture groups).

Thought it will help anyone playing a lot with regular expressions!

PS: The actual issue with Date was not directly with the parsing but later on when the getDate, getDay, getMonth methods are used. While other browsers took the browser's time zone into account, Firefox did not. I was too bored to proceed with Date, and resorted to regex to parse out the date parts from my response. Here is the snippet of the code I used:

function formatDate(yyyymmdd) {
  var matches = yyyymmdd.match(/^(ISO DATE REGEX PATTERN)$/);

  if (matches == null) { return yyyymmdd; }

  var yyyy = matches[1];
  var mm = matches[2];
  var dd = matches[3];

  var date = new Date(yyyy, mm - 1, dd);

  return DAYS[date.getDay()].substring(0, 3)
   + ", "
   + MONTHS[date.getMonth()].substring(0, 3)
   + " " + date.getDate()
   + ", " + date.getFullYear();
}

Overloading vs Variable Arguments !!!

In a statically typed (object oriented?) language, function overloading offers the facility of organizing your code into two or more functions with different types and/or number of arguments. This is highly useful when the functionality offered by the function can be invoked in different scenarios. For instance, let us consider the function(s) below:

// C# code
Dictionary<string, object> CreateResponse(string msg) {
 return CreateResponse(ex.Message, 0, false);
}

Dictionary<string, object> CreateResponse(string msg, int code) {
 return CreateResponse(ex.Message, code, false);
}

Dictionary<string, object> CreateResponse(string msg, bool success) {
 return CreateResponse(ex.Message, 0, success);
}

Dictionary<string, object> CreateResponse(Exception ex) {
 return CreateResponse(ex.Message, ex.HResult, false);
}

Dictionary<string, object> CreateResponse(string msg, int code, bool success) {
 var errorInfo = new Dictionary<string, object>();
 errorInfo['message'] = msg;
 errorInfo['code'] = code;
 errorInfo['success'] = success;
 return errorInfo;
}

Not a great example but I guess it is enough to explain my point.

The CreateResponse function has different overloads yielding itself to be used without much noise depending on the situation. If you have to create a response from within a catch block, you could go for the overload that takes an Exception object as input. And all the different overloads use or share a single core implementation, the one that takes all the possible inputs for CreateResponse. One would also have seen the same thing when implementing a class with multiple constructors. This is a very common pattern, and personally, a very useful one because you can be pretty sure about the inputs and their types. Of course, type guarantee is an integral part of any statically typed language.

Dynamic languages (such as JavaScript or PHP), on the contrary, do not offer any type guarantee, and hence could not possibly offer overloading, at least based on the types of arguments. They could, theoretically, offer overloading based on number of arguments. However, they don't, and for a good reason. Unlike statically typed languages, dynamic languages don't take the number of arguments for a function seriously. What that means is, in JavaScript or PHP, one could call a three arguments function without any arguments or less than or even more than three arguments. It is up to the implementation to deal with whatever arguments have been passed, including situations when one or more arguments have not been passed.

With the variable arguments, one could more or less simulate overloading but the implementation would be relatively messy or not natural unlike in statically typed languages. There would be a ceremony around argument checking - number and types of arguments, before they can be reliably used. It takes a quite an effort to make the function fail safe, execution wise. If the function expects an integer, it could not possibly work with a parameter that is an array. If this is all too much to worry about, one could just ignore implementing the guarantee, call it an assumption or ground rule, and and let the function fail; which is how code is typically written.

The other drawback around variable arguments, in the context of simulating overloading, is that it could end up not extensible; for instance to support future types and/or arguments. For instance, the type deduction at a particular argument index may not be possible any more if more arguments have been to be supported or even for the same number of arguments but with different types.

Actually my original musings was something else, besides compare/contrast overloading and variable arguments. It was about how the dynamic language runtime could, with my layman knowledge or as a consumer, handle type guarantee and so forth. I like to reserve a separate post, hopefully the next, to discuss about it.

Until then, I am going to let you try implementing CreateResponse in a dynamic language, say JavaScript, and enjoy the difficulty!

Getting reminded of the reminder !!!!

I have been using Android for quite some time now, and only recently I noticed that Android pops up a notification reminding you of a reminder. It says "Upcoming alarm - Buy Milk", where Buy Milk is the reminder I had set.

Is it smart enough to help a lazy volatile minded guy like me or is it trying to be my wife who would not rest until I buy milk? Don't know.

jqGrid: Handling array data !!!

This post is primarily a personal reference. I also consider this a tribute to Oleg, who was fundamental in improving my understanding of the jqGrid internals - the way it handles source data types, which if I may say led him in discovering a bug in jqGrid.

If you are working with local array data as the source for jqGrid, meaning you will get the data from the server but want the jqGrid not to talk to the server anymore, and want to have custom handling of the edit functionality/form and delete functionality, it is not going to be straightforward - you need to have a decent understanding of how jqGrid works, and you should be aware of the bug Oleg pointed in our discussion. I repeat this is all about using jqGrid to manage array data locally, no posting to server when you edit or delete, which is where the bug is.

$('#grid').jqGrid('navGrid',
    '#pager', {
        recreateForm: true,

        add: false,
        search: false,
        refresh: false,

        edit: true,
        edittext: 'Edit',
        editicon: 'ui-icon-tag',
        editurl: 'clientArray',

        del: true,
        deltext: 'Delete'
    }, { // edit options
        editCaption: 'Fix Error Record',
        url: 'clientArray',
        recreateForm: true,
        closeAfterEdit: true,
        reloadAfterSubmit: false,
        beforeShowForm: function (form) {
            $('#editmod' + gridId).addClass('grid-dialog');
            // You can disable or alter certain fields in the form if you need.
        },
        processing: true, // very important or the custom handling will not work!

        // Edit - Custom handling of submit button in the edit form
        onclicksubmit: function (options, postdata) {
            var gridId = 'grid';

            var idInPostdata = this.id + "_id";
            if (postdata[COL_MODEL_ROW_NO] == undefined & amp; & amp; postdata[idInPostdata] != undefined) {
                postdata[COL_MODEL_ROW_NO] = postdata[idInPostdata];
            }

            var clone = jQuery.extend(true, {}, postdata);
            $(gridSelector).jqGrid('setRowData', postdata[COL_MODEL_ROW_NO], clone);

            for (var d_index = 0, d_length = this.p.data.length; d_index & lt; d_length;
                ++d_index) {
                var p_data_row = this.p.data[d_index];

                if (p_data_row[INDEX_ROW] == postdata[COL_MODEL_ROW_NO]) {
                    var dataObject = this.p.data[d_index];
                    dataObject[INDEX_NAME] = postdata[COL_MODEL_NAME];
                    dataObject[INDEX_AGE] = postdata[COL_MODEL_AGE];
                    dataObject[INDEX_STATE] = postdata[COL_MODEL_STATE];
                    break;
                }
            }

            if (options.closeAfterEdit) {
                $.jgrid.hideModal('#editmod' + gridId, {
                    gb: '#gbox_' + gridId,
                    jqm: options.jqModal,
                    onClose: options.onClose
                });
            }

            options.processing = true;
            return {};
        }
    }, {}, // add options,
    { // delete options
        processing: true, // very important, else the custom handling will not work!

        // Custom handling of the delete functionality.
        // Prevents posting to the server but handles everything locally.
        onclickSubmit: function (options, id) {
            var grid = $('#grid');
            var gridData = this.p.data;
            var selectedRows = this.p.multiselect ? this.p.selarrrow : [this.p.selrow];

            for (var index = 0, length = selectedRows.length; index & lt; length; ++index) {
                var rowId = selectedRows[index];

                for (var pd_index = 0, pd_length = gridData.length; pd_index & lt; pd_length;
                    ++pd_index) {
                    var gd_row = gridData[pd_index];
                    if (gd_row[INDEX_ROW_NO] == rowId) {
                        gridData.splice(pd_index, 1);
                        break;
                    }
                }
            }

            // Refresh grid to previous page if the current page is the
            // last page in the grid; so that when all records of the
            // last page are deleted, we show the previous page.
            if (this.p.page === this.p.lastpage) {
                grid.jqGrid('setGridParam', {
                    page: this.p.page - 1
                });
            }

            // Refresh the grid to load the changes
            grid.trigger('reloadGrid');

            $.jgrid.hideModal('#delmod' + gridId, {
                gb: '#gbox_' + gridId,
                jqm: options.jqModal,
                onClose: options.onClose
            });

            options.processing = true;
            return {};
        }
    }, {} // search options
);

Hope this post helps any poor soul battling the same or similar problem. You should definitely check out the question I had originally raised at StackOverflow.com, and the interesting discussion thereon.

Clean Code

I received quite a lot of criticism for Dealing with Bad Code. The criticism was mostly along these lines - "There is no good or bad programmer. The good programmer thing is more of an illusion. When you place a programmer in a domain in which he has little or no experience (like a PHP web programmer writing C++ code), he will soon be seen as a bad programmer. What is branded good or bad is subjective."

Although it sounds to make sense, I don't completely agree with that. Maybe the topic of the discussion was ambiguous. It wasn't the programmer but the code. I am not willing to spend my energy to demotivate somebody by branding him a bad programmer. But I will in reviewing anybody's code, not just brand it bad code but ultimately clean it up.

I believe programming isn't restricted to language. Although the language used to program has its impact on the way a problem is solved, it doesn't limit the programmer from losing the basics. In other words, a programmer should be able to program in any given language; of course he needs time to study the language. So if a PHP programmer is writing C++ code, he can't stick to his old habits and disregard memory management, and also be aware what is considered expensive in C++ unlike PHP. I agree that every language has its areas which cannot be mastered without exposure and time, for instance template meta-programming in C++. I doubt if one who has programmed in one of the dynamic languages all his time would even comprehend seeing results at compile time.

So if one transcends the language wars, programming is about three things - logic, semantic and structure. I am going to assume that those terms are self-explanatory in our context. And if I were to order them, they are reversed ordered......to sound better. Although the order relates to the importance of each facet, one cannot and should not be sacrificed over the other. Each facet carries equal importance as the other and must be given attention to achieve good code. So the order is more of which one to attend to first.

Whenever I came across code that could made better, I had thought making a collection of such things. Well, I think I am up to it now. I am starting to write a series of posts (at irregular intervals), which will talk about how certain piece of code could be written so that it is easier for the reader to understand; in other words tell him why something is done a certain way. We see that line '...for the reader to understand...' everywhere in books and articles. The assumption there is that the reader is looking for the reason. If one were to just read code literally but never question why it is or is not written certain way, we got nothing to discuss. So every effort taken to write good code, and more importantly, maintain it that way, is not just for self-satisfaction.

Let me get started with the first one today, and it is about logic. Logic means how do solve a certain problem (specific and granular) efficiently. Efficiency does not mean only speed. If you can solve the problem in a comparatively fewer lines code without losing clarity and readability, then that is efficient. That sometimes involves educating ourselves and our peers with new techniques. For instance, in a language of your choice, how would you implement a function that returns the sum of all numbers starting 1 through N (including). One could start with this:

function sum(int n) {
    int total = 0;

    for (int i = 1; i <= n; ++i) {
        total += i;
    }

    return total;
}

That's about 5 effective lines of code. It can be made succinct:
function sum(int n) {
    return (n * (n + 1)) / 2;
}

The above code is just one line. One could even question if we need a function. If programmers in the team were educated with the technique, calculating the sum doesn't need any encapsulation.

Some people will fight back saying what I am explaining here is just algorithms in action. True but it is not just limited to applying algorithms. What I am talking about applies even implementing an algorithm. I am talking about how can one write logic to improve the efficiency of code without losing the readability. I will leave it to the reader whether to agree with me or not.


The Windows Phone Epic !!!

Dear Reader, Do not be overwhelmed at the length of the article. I have tried my best to keep the length of the article not directly proportional to the time required to read it.

Oscar Wilde said, "If you want to tell people the truth, make them laugh, otherwise they’ll kill you". There are times when truth tends to be subjective, such as this article. However, I have definitely added the fun component to keep up earlier promise. Consider the time you spent reading this article as a break from your work or routine. I am sure you will enjoy it; doesn't matter if you are using a Windows Phone 1. Perhaps you will read it again.

I am programmer 2, gadget savvy, an avid fan of Microsoft products (especially Visual Studio and associated suite of development tools), and an honest critic of any product I use. I have an Android Phone, an iPhone, and for a few months now, a Windows Phone. And this is my experience with the Windows Phone - good, bad and grey.

To begin with, the Windows Phone landscape (app and feature set) is dry and unpromising. There are a few good things here and there to console ourselves for the money we spent on the phone, and for the love of Microsoft!

  • App Store
    • It is just a poor thing. Every category or collection has a finite set of apps. Most of them don't look professional, except they wear the Metro UI look. For instance, try searching for a simple one like notes taking app, and you should see, say ten, crappy apps. To those developers, pardon me but this is not your mistake or problem. Contrast this with Apple Store or Google Play, and you should realize the difference. Now, should a notes taking app be the gauge to rate the App Store? It depends. Look at the variety of apps/solutions provided for such a simple problem - taking notes.
    • The App Store app in the phone, oh that's another shame. It is slow and crashes a lot of the time. At first, I thought it was just me but then Googling with Bing 3 revealed the secret. Try it yourself, not the Googling with Bing, and see that there are complaints about the App Store. A real time example, open App Store, and in the next nanosecond, hit the Search icon as if you are trying to look for an app. Most of the time, it crashes. Or let's say you want to see the screenshots of an app before installing it. Before you land on the screenshots page, you'll have to wait until you read (or at least see) the reviews.
    • It seems that there aren't really many interesting apps, at least the ones that are expected to be available on any mobile platform. The list is endless but a few of them are discussed in the sections below while comparing them with an existing app, or ranting that such an app is not available on Windows Phone.
    • Finally, to convince the user that there are so many apps available on the Windows Phone platform, the phone is loaded with all crappy apps from AT&T and Nokia (in my case).

  • Tiles
    • In my opinion, the Tiles is by far the biggest screw up on the phone. It seems to me the whole Tiles thing is, bear with me, a stupid idea. Hang on, don't blast me. It is a good idea for a particular subset of the idea of notifications. Applied as a generic solution on a broader scale exposes its limitations and makes it a failure.
    • Tiles can display only a predefined category of information - title, count blah, blah, blah; there by restricting applications in using it in their own creative ways for providing updates. That is a severe limitation. Tiles is not even a healthy competitor to the Notifications Tray that Android boasts of. Even Apple had to copy, sorry get inspired and borrow, the Notifications Tray, and they have us two.
    • Note the term "Even Apple". Yes. If Microsoft can be considered to have defined the Desktop, Apple IS the one who defined what a smart phone is. So…even Apple had to borrow it from Android (because they want everybody to love their phones and continue using it).
    • The Tiles doesn't stand a chance with Android's home screen gadgets either. In the end, Tiles are just fancy; maybe they just flip around every now and then to say, "I am alive".
    • If an app does not have a Tile, any updates that the app generates or receives, if not attended by user, are lost, completely lost. That is like not receiving updates at all. This amplifies the frustration coupled with the restricted way of providing updates. So if you don't have a tile for the dialer app, you wouldn't realize that there are missed calls. That means you will end up laying tiles for almost for every app that you install.
    • Even if you have a Tile for an app and even if it is updated, say with the count or title, and if the tile is way down below, the user will not have a clue that there is an unattended Notification, unless he scrolls down to the bottom. Well, Tiles don't seem to serve its purpose exactly.
    • For those apps that do not have a Tile, the notifications are lost, as already said. So in the night, with the phone by my bed side, it plays all the ding dongs. If I don't act fast to pick the phone to see what the update was, it is lost. Initially this was disturbing my sleep a lot. Bu these days, it is a lullaby for me. Just plays the ding dong or harmonica every now and then, and I just pull my blanket tighter and smile in my dreams. LOL!
    • This is the tricky part. Where do we place the Tiles concept - like the app icons in an iPhone or the app drawer in Android. Maybe it all started to be the best of both and ended up bad. There is no folder like thing to group related Tiles or a similar thing with the app listing inside. You know there doesn't seem to be a way to MANAGE stuff on the phone.
    • The positive side of Tiles is that you can not only pin Tiles for the app but also for the app details. For instance, you can pin a Tile for the stocks app or for a particular stock symbol. But that is not something that the home screen gadgets or Notification Tray could not do.
    • I have mixed feelings about the limited palette of colors for the Tile. Sometimes, I feel that the user should be given the choice to choose a custom color for the Tiles. Other times, I feel - most of the times you are out of the Tiles screen, in the app or somewhere, so Tile color doesn't matter. However, the universal applicable, light or dark theme is good.
  • Contacts
    • I consider the Contacts app as the second biggest screw up. Android lets you create a contact with as many email addresses or as many phone numbers or as many custom fields you want to have in a contact. The other wonderful thing is you can name a field, even phone or email, whatever you like, aside from the presets - Home, Work etc. How does this help? Imagine one (or more) of your contacts is a consultant. I am not giving a corner case of having consultant(s) as contacts. I am just giving an example where the expected would make sense. So he is working with currently three clients - A, B, C. He is expected to work with them at their place. So he is given an email id and desk phone number at each place; although he is going to be at only one place at any given time. It would be better to create a contact, in which you have all his personal and work emails and phone numbers set up, and even name them by the client he is currently working with.
    • You can apply the above example even for friends and family, where you can group the ways you contact them within the contact, and give them meaningful names rather than work2 or mobile2. Worse part is you can't even have more than one work2 or mobile2. Oh, that would be work3 then? LOL! For instance, Sammy is my primary contact although his wife and brother are good friends of mine. I bother Sammy anytime in the day but talk less with his wife or brother over phone/mail. So it would be best to have Sammy as the contact in the phone, and name the mobile and emails of his wife/brother by their names. Android lets you do that (so does iPhone when you set Google Contacts sync). When you receive a call from one of the numbers in the Sammy contact, Android tells you it is from Sammy contact and which number by the name - wife or brother or dad. Less cluster in the contacts. Or Microsoft mistook contacts with the apps and show a count here too. LOL!
    • Similarly, you can have only one personal email address for a contact (or one work email). Thank God, it is not restricted to Hotmail. LOL! If you try to add and set another email address as personal, the older one becomes other. Later you can't add any more. This feels like 1950s. Come on Microsoft, pick a bit from Android, nobody is going to curse you for that.
    • And then you should link your contacts or else life is going to be a mess with all the different type of contacts per contact - Hotmail, Messenger, Skype and what not. More on this in Messaging.
    • Other monstrous thing is the integration of the social networks the contacts. I can't explain why but it gives the app a heavy cluttered appearance. However, some of my friends, for instance Sammy, think that the integration of the social networks with the Contacts app is easier to stay in touch and up-to-date. He says he can see a friend's update, be it Facebook or LinkedIn or whatever, in one place. When I see the news feed of Facebook in the Contacts, I feel like reading a newspaper, not a social media update.
  • Messaging
    • Where shall I start? Skype or Messenger? And they have been merged? Then why two apps? Ask people around and you should be hearing the confusion with receiving messages from Skype and/or Messenger.
    • Microsoft, you have bought Skype. Why don't you integrate it well in the phone so that I get the feel that there is no running cost for messaging?
    • Every time you open Skype, it has to fly these dots (loading!). Can't it be faster? Oh, you don't believe me? Or bother about it? Try being online in Skype on the phone (and on the desktop), and chat with your friend. Tell me when do you get messages in the Skype on the phone. There is a big delay in receiving messages on the phone. Sammy says he doesn't even receive messages some of the time, and next time when he logs in Skype on his desktop, they show up. Why is all this drama not happening with Hangouts on Android or iPhone?
    • When you setup your Skype account, it creates contacts, which are categorized as Skype contacts. Forget about some option that allows you not to sync Skype contacts. Then there are Messenger contacts. So there are three types of contacts that I know of - Outlook, Skype, Messenger. You then link the three types of contacts for each contact so that you get an unified view. Ufff! Look at Android. You create a contact with the phone, email etc and there is a field for messaging (Google Talk or Hangout), which is automatically picked by the Hangout app. That is an integrated ecosystem. Is there a data theft here with this integration? I am not sure of that, I think no. Maybe the Google Plus will do that behind the scenes. You can also save other messaging ids for the contact - Skype, MSN, Yahoo etc. That's what we want with the contact; save all his/her information in one place, and enable integration wherever possible or needed.
  • Facebook - There is an old saying, "Better not to have one which is worthless". This might be contrary to "Something is better than nothing". You see…not having a decent Facebook app is taking a philosophical turn. I can't imagine what is good about the app. The app is pathetically slow in every thing you can do in the app - open a post, image, comments, anything you do. You try to be smart and use it fast, it crashes! Miserable. I don't know why but the live Tile of the app is just brick. I don’t see any updates on the Tile. Oh, the background task for Facebook can't even be blocked (as stated on its settings page). So it is definitely running and eating my battery. Just look at the state of the app of an universally accepted social network, a Microsoft ally. Facebook app or apps of that sort is sort of a sliver bullet to be in the game, if not win the giants.
  • YouTube - Google has gone rogue preventing Microsoft from building a native YouTube app (or rather pull down the one they originally built). So there is not much hope here. Or will Microsoft wage another war to lose - build a YouTube rebel? It is left in the hands of the developers (or development oriented software companies) to build a YouTube client (for Microsoft). From what I heard, I went ahead with MetroTube. It is decent and rated well by the few you are using it. It is up to the user community to request improvements and promote MetroTube (or another that deserves) for serving our YouTube hunger. Ditch Google, and move on. Believe me, there is a life beyond YouTube.
  • Email
    • The default mail client on Windows Phone is a very decent one. Oh, iPhone mail client sucks! It is looks clean and professional for work mails. However, the interface becomes less interesting for a personal or non-work related mail. For instance, it appears boring to see Gmail or Hotmail in the default mail client; feels like I am wearing a tie when I am replying my friend.
    • By the way, you won't be troubled with having to see a bored interface for Gmails. Google went rogue again blocking Windows Phone from receiving push mail. That is cheap! That is ugly business. So nobody complain Microsoft about monopoly or business tricks.
    • Usually the user interface standards, rather call it the philosophy, defined by Microsoft is extremely thought-through. It wouldn't be hard to agree that the standards are based on experience and expertise. Enough hero worship. We got a few slips here with the mail client. For instance, when you want to do bulk operations with the mail messages, you would select them, then start playing with it - mark it read, move it to some folder, apply some category, flag them etc., all without having to select them after every operation. Well, this is a royal pain we have to bear with the mail client.
    • Imagine you are configuring three mails on your phone - your primary Hotmail, company A, company B (assume you are going to ne a consultant with A and B for a long time). Once you configure them, you will have three items in the apps list with the name you chose - Hotmail, A, B. So it is again, "Go look for your mail all over". Oh no, you can pin it as a Tile! :(
    • There is no item in the apps list like Mail, which lists the mail accounts configured, and you go open the mail there; maybe a conventional boring way but better than scattered? There is one such grouping in the Settings, but touching the mail account there will open up its settings.
    • It looks professional and all but you can't edit inline in the reply. What I mean is when you are editing the reply to an email, you can edit only in the top where you can write your reply. You cannot edit anywhere below in the mail chain, like adding inline comments or such. This is total crap. Doesn't Microsoft know that is how work mail conversation happens?
    • There are no professional yet cool third party mail clients like Boomerang.
    • This may be not the appropriate play category to say that the Windows Phone does not have a Cut-Paste facility but is needed most when writing/replying mails. Why do you need it? I need to cut a text and paste it elsewhere. So copy it, we got that, delete the text by backspacing, and then paste wherever you want it. Thanks! LOL!
  • Maps
    • First few times, you look for Maps (or something starting with M), and wonder if the phone has a maps app. Or has Google banned maps too? LOL! You look for it everywhere and it is Here. what sort of a name is that - Here?
    • Why the hell do we need these different apps - Drive+, Transit, Maps? I think it is just to increase the app count in the store/phone.
    • Hear this: Once you start navigation, there is no way (at least I couldn't find it) to see the route we are going to take. You just have to take lefts and rights that the app tells you. Other thing is it does not give you different routes to your destination. For instance, if you have to go to B from A, there could be more than one highway or express ways. No mention of that at all. If these guys can't imagine such options, at least learn it from Google, and call it inspiration. Nobody's gonna complain.
    • Here maps does not show you the list of possible routes to your destination. Google Maps shows a list of routes and you can choose whichever you think is best for the time. Also in a selected route, it shows if you have to take the north/south or east/west of the freeway; very helpful for tricky freeway entries where the north/south or east/west bound roads are close, and needs a split second decision to enter the right one.
    • I don’t know if Waze was spying me. But by the time I had completed writing this article, they had released it. Anyways, it is a good thing that happened, and saved MS/WP from a lot of shame.
    • Before we start clicking pictures (Camera discussed next), let us suggest Microsoft some alternative names for Here - Navigator, Traveler, Caravanning. It seems Microsoft won’t renaming it to Maps. Besides, Microsoft is already on a full course to screw up renaming Skydrive.
  • Camera 4
    • The camera is really a great thing on the phone. See you can take 34MP pictures on a mobile phone. Now can you make a call on a Canon EOS Rebel or Nikon D series? OK, that seems to be out of line. No doubt, it is a damn cool camera. It is way better than the one in Android. We will save time comparing with iPhone(5)'s camera. I consider iPhone's camera nothing more than a dummy.
    • Apple folks, you feel like punching me on the face. Try the picture you took with your iPhone on your laptop. Life is not as colorful as it seems on the iPhone. Now why would you do that? Even if you do, you probably are going to see it on your Mac. Well then, that's the bubble you live in.
    • Really, the camera is awesome, along with the apps for the camera. Try this picture. It is an amateur attempt to capture the fall colors. The contrast of the image was corrected a bit but try that picture on any screen - laptop, LED Monitor or even Mac. The picture is promising. I have the same picture for the lock screen. An unbiased comment - Life truly seems colorful. Try a picture taken by an iPhone camera, and you will see the difference. At least that is my experience.
  • Browser
    • First, I don't think there is anything in particular to complain about the browser on a Windows Phone. It is doing a decent job. I have never seen the browser crash. I have not done intense laboratory test for the speed but it was not slow for about 6-8 tabs. Well, I have managed until now not to call it by name because I don’t want to insult it since it is a doing a decent job. But it has to be called something, like Google initially the one on Android as the Android browser; now it is all Chrome (OS?). Even on an iPhone. LOL! Let us take the shame - Internet Explorer.
    • See there is an ugly game called competition one gets be pulled in, like it or not. We are expected to at least stand in the field against the competitor. So does IE on the phone stand a chance with, say Chrome? Let us forget the data collection business and all your data in sync in our servers features of Chrome. The question is Are we satisfied with IE because it is doing its job? Better than its Desktop sibling. Can it bear the weight of, say 25 tabs? The current maximum tab limit is 6, I guess.
  • Music
    • Sometimes, consistency is boring. Everything in Windows Phone is Metro UI. You got to let the app preserve or define its look and feel, and not insist that a recommendation like Metro UI be the thumb rule. See, Metro UI is a wonderful way of displaying information. It is cool, professional, modern. Have you ever tried the Zune desktop player? That's where Metro started. They killed Zune along with the Zune player. That's another sad story. Back to the point, I think the Metro UI was little too much for the Music + Videos app, as it is named in the app listing.
    • The Music + Videos app, has got God knows what. It just lists everything - music, videos, radio, apps etc., and it is just awful.
    • To shuffle play all songs, you look all over, and discover that you go to the Songs screen, play a song and choose the twisted arrows icon. Come on, this is every day stuff. There is definitely a better way.
    • Having a Nokia phone, there is a Nokia Music app, recently renamed as Nokia Mix Radio, and made it crappy inside. Guess what, there are Tiles inside the app. This is what I am talking about, a little too much Metro!
  • Office
    • Now, we are talking something. There is a supposedly full fledged Microsoft Office installation that comes with a Windows Phone. I am not sure how full fledged it is but I was able to view all Office documents on the phone. The view was splendid, especially the Word documents. PowerPoint presentations were decent enough to view, nothing to complain, in the portrait mode. I was able to edit Word documents very well except there was only a limited set of formatting tools. Excel was a bit tough, both viewing and editing. But nothing better can be imagined on a phone. Else we would end up with something uglier. LOL! Maybe that's why the Nokia 1520 was made bigger.
    • With the tablet, I heard Office is all full fledged with comprehensive editing since you can hook it up with a keyboard. But I haven't tried a tablet.
  • Battery
    • First shoot the naysayer, and then let's talk. The battery life is decent, far better compared to an Android. Unlike Android, I keep all network stuff on all times - Location services, GPS, WiFi. It serves one whole day with browsing and using maps. I use maps almost everyday to find a congestion free route back home, exploring unnamed roads.
    • How much battery I got left is stashed deep inside  - inside Settings/Battery Saver. Why?
    • There isn't a clear distinction if the battery is charging or fully charged, particularly when it is around 95+%. Isn't the charging intense and takes time when the battery is charged around 80-85%? I am not sure if it makes some sound when it is fully charged. Can’t hold an ear sitting beside the phone while it is charging. I got other business to do.
  • Miscellaneous but not the discarded
    • Form factor: I don't mind carrying big phones. So size is not concern for me. It could be a bit thinner, but not very. But weight definitely is something to be concerned because your kids might get hurt if they had to drop it on their feet. LOL! I wouldn't suggest competing with an iPhone because weighing a few grams more is not the reason why most people don't carry a Windows Phone.
    • Display: This is a winning factor in the phone. The display is simply amazing; it can be no better. Text is sharp and clear. The pictures look wonderful (in the display and also on a PC). The display does not hurt your eyes. In my opinion, it is better than an iPhone. Sammy said that the display doesn't even require a screen guard.
    • Date
      • Is there a way to know the date/day on the phone? Yes, there is. Lock the phone and press the power button to unlock it. You will see the date and day on the lock screen. Is there a way to know it after unlocking? No. Why? Because you already saw it when unlocking. LOL! Better or not, Android and iPhone have got simpler ways.
      • Or you should have the calendar Tile pinned. I don't want to pin a calendar Tile. Then how else would you know your appointments? I am not a professional, I don’t have any appointments. Even if I do, why I can't get alerts or notifications like Android? If Microsoft is envisioning its phone only in the hands of a few white collared men, like Blackberry, then they have sworn for a suicide. Like I said earlier, Tile is not the problem but only Tile and no other way is the problem. Let the user decide what is convenient.
    • Privacy (especially location services): Apple reaches your pocket for sure but at least it is not obvious if they are hindering your privacy. iPhone lets you decide if an app can access your camera or photos or other pieces of your phone, especially location. It lets you restrict even the camera from the accessing the location information. When some app is using the location services on the phone, iPhone popups a tiny arrow in the top bar. Good to know. Seems Microsoft copied it in the middle of the night. They copied only the tiny arrow and made it like a Target circle. They did not bring in the application level privacy control. Being the middle of the night, they couldn't think straight and thought Android's way was better. Android did not lose the game by not having this privacy restriction because Google's agenda is all on the news. Google wants to track everything you do anywhere so that they could make the car intelligent and make you sit dump in that car. LOL! But human mind is the most creative one, an optimistic one too - now you can drink and let the car drive 5. LOL!
    • Kids Corner
      • What if I don't have kids yet? Well then, make some and use the feature. LOL! All that means is Kids Corner is not a winning factor. It is not a USP (Unique Selling Point). iPhone and Android are in the game without it.
      • Nevertheless, it is really a must-have feature if you have kids, and if you want to give them your phone to play with (so that you are not being bugged). Sometime back, Ananth compared it with the Accessibility feature in iPhone. It may bear a resemblance but this one in Windows Phone is definitely the right shape and form. Anything else or less is discounted. Sorry!
  • Some of the popular apps that are not available on Windows Phone
    • Vonage
    • None of the Google apps - Chrome, Hangout etc. The argument that you have to switch to Hotmail (or MSN or Live or Outlook) is rubbish. I don't have to renounce my Gmail if I was to move from Android to iPhone. This is strictly not Microsoft's fault but somebody has got to take the blame. There is the Google search app though. Google doesn't want to leave a chance in grabbing the user data. Or would the normal user even know about Bing? LOL! I don't know who that normal user is?
    • No good news app - Sammy tried hard to bring sense into me about the Bing news. I don't know there is little or no fun without opening the app. Android having the Notification Tray helps me read the news right there, without opening the app, or without much hassle.
    • No simple decent notes taking or TODO app. If you find it hard to accept, visit the Apple Store or Google Play - Out of Milk, Remember the Milk, Notes List, NoNonsense Notes etc. OneNote is a giant, and I just want a sticky note. OneNote is like an axe to pluck a rose. For instance, I am writing this article in OneNote. I would expect to do it with the notes app or would I expect the app to handle such a case. Hey, how about EverNote? Fortunately, you have it for Windows Phone. A rose by any other name is still a rose. EverNote is equivalent to OneNote.
    • Facebook - Although the phone comes with an app, it is as well not having one.
    • Telegram - Don't know what this. Visit Apple Store or Google Play.
    • There are more, especially some games. I am not into games.
I am not any brand fanatic, like Apple fans. I am not rich or am I a movie star to keep changing my phone for a show off. I just want a good product in my hands. For the tiny special place in my heart for Microsoft, I want it to give the users the best mobile experience. All the screw ups that I have pointed out is not because Microsoft doesn't have the people or skills to do it. An unbiased tech person would agree that Microsoft hosts some of the most brilliant people in the world; pioneers in their fields - Anders Hejlsberg, Herb Sutter, Eric Lippert, Chris Brumme, Mark Russinovich, Patrick Dussud, Scott Hanselman, Jeffrey Richter, and a lot more whose names and faces is not in the news. Do you think that the people who were involved and/or developed Windows Phone do not know what they are doing?

I have often times heard from Ananth, under the covers one of the greatest Microsoft advocate, "Microsoft products are robust and awesome under the skin. It is the business model defined outside that throws a rogue face. This is especially true for the Windows operating system". To partner with PC/laptop manufacturers and other software application vendors, they have made the Windows operating system bulky. What am I trying to point out is that the failure of a product or ending up with a product with limitations like the ones pointed above is beyond the engineering team. It is with the business/management/marketing team, whatever you call it. I have not been a fan of the Microsoft business team. Some or most of them seem to have put their feet in Microsoft when it started hiring in the early 80s, and have managed to stay here still scratching the seats with all the old school habits like selling curtain hangers. Look at how big the list of failed products they have produced, like Windows Me and Vista. Why would you spend millions of dollars to release an OS for the millennium? Are we making a movie or is it a new year deal on the millennium eve? Or make a product with such segmentation - Home, Premium, Professional, Advanced, Ultimate. What after ultimate, hand the source code to the user? LOL! We are not making cars or looking for an apartment here. That is damn old school; nobody gets it all but they still pay us. There are far better, simple yet modern, ways to make money selling software. It is not about selling at low price. Apple does not sell it cheap but its iPhone and Mac are the market leaders.

Then Microsoft took its chance to build hardware, which is ironical. They build operating system and software to run on a variety of vendor platforms. Why would they have to change course? Why Surface? Is it to prove that Windows runs faster on their hardware and that the problem is with all the vendor hardware. They should spend the time and money on how to make Windows lighter, faster and robust ever. Like Apple fanatics, there are Microsoft ones too. They will claim all is good with Windows. My Ubuntu boots in less than 5 seconds, and runs from my VMWare on Windows like sliding on butter. Try all that with Windows, especially after a few months of use. It is alright if stuff like Surface is research material. The business and management team's agenda should not be just make money but how to make it. That's where people like Steve Jobs shine. The Apple business team chose to reap profits with what they could offer next. Compare that with Steve Ballmer. Microsoft never seemed to have had a leader like that, and it seems to hit hard now after a long time. Sadly, it seems to be the end of its era, as I heard from somebody.

Since the day the Internet Explorer was built, there have been hardly any improvements. Shoot him who shots tabs! LOL! Don't freaking show me browser speed and other comparison charts? Get your hands dirty in web development. Or better ask the community. How many of them use Internet Explorer as the primary browser in their projects.......for development? Does the business think that it is the fault of the engineering team or they lack the capability to make it better? Well, throw them away, you got better people at Microsoft. No, that is not the agenda. I guess that the business is assuming, "while on windows, it is going to be IE". What does an incompetent dancer say when he did not perform well, he says that the stage was bumpy. That is what Microsoft business team is saying: http://m.wpcentral.com/pawn-stars-chromebook-scroogledhttp://microsoft-news.com/after-apple-ipad-new-surface-ad-takes-on-samsung-galaxy-tab/. This is an act of absolute shame. Why does Microsoft care if Google's laptop is worth pawning or keeping? Or if the Samsung Tab doesn't have USB port? Why does Microsoft care if Google is stealing data or donating millions? They should spend their mental and financial energy in making Internet Explorer better. Or are they thinking what is left in IE to make it better? Everything Goddamnit.

Am I digressing from the point? Nope. When Microsoft decided and went out to make the Windows Phone, who made the agenda and what was it? It is not the engineering team, or just them with the complete liberty to screw up. The engineering team has all the capabilities to build whatever a phone should be and beyond. Did the business/management/marketing/sales team do their homework? Or were there staring at pie charts over coke and pizza to figure out a way to grab the left over 2% of the phone market? Some of the limitations that I discussed above seem to be deliberate. As Sammy says, the Windows Phone 8 is not an upgrade of Windows Phone 7. They killed WP7 along with the few thousand apps it had, and built a completely different one WP8. Nobody, especially the small but brilliant ones, would spend again to build it for WP8. That is not an engineering team screw up alone. What was the cover up, compensation as a better word, for the offered by Microsoft community to kill WP7?

Is there a remedy for the outcry? Wish people like Elon Musk agree to take up Microsoft. They are people by whom the title (CEO) is honored. There is an old saying, "Scholars should rule". Steve Ballmer enjoyed a decade of monkey dancing, mocking the $500 phone with a single button and selling curtain hangers. There are more Steve Ballmers in Microsoft. As always say to my friends during our chit chat, "Throw the bastards out, Microsoft will be skyrocketing".

Let me tell what is the gem of all things in a Windows Phone. Even on a single core mobile processor, it had an unparalleled responsive user interface. How many of you had the chance to use an Android in its early days, Android 1.6 (Donut)? It had a cheap horrible user interface, and it begged the user to let go; it was miserably slow. Android had a real make over sometime around or after v2.4. The first version of Windows Phone on a petty economy Nokia model was fluid; the UI did not jam or freeze. The community gave Android chance after chance to pull itself together and join the game. Microsoft deserves the same fair chance, to get the users what they want.

The Metro is an excellent user interface design. In many ways, it makes the user interface simpler to use. When Android and iPhone rule the market, it was good of Microsoft to think outside of the established user interface standards and come up with Metro UI. Don't agree? Pull your head out of the hole. LOL!

Last but not the least, it has the most sophisticated development environment - IDE, powerful modern programming languages, tools, APIs. Ask the developers. Try Eclipse, and know better.

Are you waiting for a verdict? LOL! As consumers, I think we should expect a good product in our hands. Heard somebody say, "Imagine a phone whose hardware is powered by Apple, and user interface/SDK/tools developed by Microsoft". Where does that leave Google? Let them steal all the data. LOL! No, no, the quote goes like this: Imagine a phone whose hardware is powered by Apple, user interface/SDK/tools developed by Microsoft, and integration of applications powered by Google.

Expect nothing less, hope the Windows Phone gets better!

You might also be interested to read about Windows Phone from an expert - Scott Hanselman.

Appendix
  1. The term Windows Phone or WP referred in this article refers to Windows Phone 8, which is the current version. An earlier version, not technically a predecessor, of the Windows Phone 8, is explicitly referred as Windows Phone 7.
  2. I like being called a Programmer rather than Developer, Coder. Especially Coder sucks. When somebody calls somebody Coder, I think he is saying, "tighten the screws well so that it does not leak again".
  3. The term Google with Bing is borrowed from Scott Hanselman's writings and/or speeches.
  4. The camera and all user experience discussed in this writing are based on a Nokia Lumia 1020 (2GB RAM). Nokia has a bunch of apps just to show off its footprint. There are so many camera apps from Nokia that a normal user is going to have a hard time picking one.
  5. The drink and drive sort of meaning in the statement is only for fun. It is not intentional nor is it being proposed with the advent of Google's automatic car.
  6. The Android phone referred in this article is Nexus 4 or a Samsung Galaxy S3 (not in all cases). Nexus, being Google's flagship, is enough to consider it for comparison with other mobile phone hardware/software.
  7. The iPhone referred in this article is an iPhone 5 (white color, LOL!)
  8. I don't consider this article a review of the Windows Phone, like the ones one would find on CNET or similar sites. It is rather from an experience of using it for quite some time. It is from the perspective of a user, aware of what is good, bad or grey. This article discusses a lot of areas in the Windows Phone but is definitely not extensive in covering all the aspects.