Why then do the geeks [especially the programming ones] not hate C, C++, and Unix?
C is fairly obvious, the lack of index-checking on arrays is the reason for most all of the stack-overwrite error/security vulnerabilities.
The typing system is horrible, characters in particular ARE NOT SIGNED! (And even if you were to define the "sign-bit" as a case-indicator that utterly falls apart for languages with more than 2-cases, like German which has a Title-Case).
The Syntax makes it easy to make errors, one of my 'favorites' is the assignment-in-condition-checks e.g. if (user = administrator) { ... };
Another is the the non-regularity of the operator-assignment shorthands; "!=" should apply 'not' and then assign the result.
The lack of strings is annoying and, in reality, the natural result of the lack of "real arrays" in C, that is they lack information on the valid indecies.
The OpenGL API is a good example of how nasty things the become in the C world; in particular because of the lack of procedure-overloading AND the lack of strong-typing, AND the lack of arrays.
As for OSes, Unix and its derivatives inherit a lot of the mentalities of C, simply because that language is so "close" to the OS.
The storage of everything, config-file wise, as [unstructured] text is fairly annoying. There are no guarantees on the structure of the text, as there would be in .INI files which retain the readability of plain-text while giving the advantage of grouping together 'attribute/value' pairs in its 'sections'.
Having said all that, it's odd that so many geeks embrace things like C/C++ after having been forced in academia to use C/C++, I would think that once in the "real-world" they would use better tools. Like Delphi (or even VB) for deving GUIs, LISP for lots of scripting tasks (EASY to write a parser), and so forth. The .NET ability to use multiple languages is probably underused with the MS pushing for everything/examples to be in C#; but I'm of the opinion that different languages for different domains is a good idea. Now, in order to avoid being wholly negative I should offer what I perceive as superior alternative to the C/C++ paradigm (imperative/procedural).
Ada:
Just MHO, of course, but that's what it seems like to me.