None of these heuristics are absolute laws, no one isolated heuristic is sufficient, and the heuristics sometimes conflict. When two heuristics conflict, you need to decide which is more important to your application and ignore the other. However, beware of ignoring a heuristic simply because violating it does not create noticeable consequences for your program. If you get into the habit of ignoring a certain heuristic, it becomes useless. The heuristics are ordered in terms of compatibility, then speed, and finally functionality.
Speed is next because performance requirements are easy to determine, and often important.
Functionality is last, because once you decide the compatibility and speed issues, your choices become much more subjective. Narrow your choices by deciding which operating systems you need to support. This article treats all operating systems outside these two series separately. You may also need to support Unix. Most of these varieties are Winsock's extensions to BSD sockets, added to take advantage of new Windows features.