To take the last question first, software will never be “bug-free” for two reasons. The first is of course the Great God Profit. In the spirit of Steven Leavitt’s Freakonomics, it is clear that it is not in the economic interest of a large company to produce bug-free software – it is simply too costly. This is where smaller, individually owned companies have an advantage: they are not as tied to quarterly financial reports as larger, publicly owned companies. They are also likely to be more personally committed to producing good software if they created and developed it themselves. The second reason is more substantive. Even with all the Quality Control in the world, no company can test for all the possible configurations and uses (and abuses) the software will face in the real world. Unusual configurations can expose shortcomings that no amount of laboratory testing could reveal.
As for the key question of just what is a bug, a lot of people tend to define a “bug” as anything software does that they don’t like. Or, as one user put it recently, “a bug is when the program does something it should NOT do” and possibly also “when the program does NOT do something it SHOULD do.”
From a developer’s point of view, a bug exists when the software does not perform the way it was designed to. If it was supposed to do “x” but does not, that is a bug. If it was not designed to do “x” then it is “Working As Designed” (WAD). (You may have heard this from tech support).
No matter that the design is flawed, idiotic, etc. The frustrated question “how could they not see this is stupid” is irrelevant here (although linked to the axiom that any time you have to start a sentence concerning software with the phrase “you would think that....” you know you are in deep trouble).
This is a golden opportunity to invent two new acronyms: WAPD (“Working As Poorly Designed”) and even WAVPD (“Working As Very Poorly Designed”). Are these bugs? Not technically. Are they infuriating? Oh yeah.