Hex is used to display the values because a) it's easier on the eyes than binary, and b) it fits the data more succinctly than other number systems (an 8-bit byte has a range that fits perfectly into a pair of hex digits; 00 to FF, rather than 0 to 255 in decimal).
So it's a coincidence really of 2^8 (a byte) == 16^2 (pair of hex digits), nothing more.
What programmers use to create programs range from:
- high level languages that are close to human-readable and require significant optimization and compiling to be turned into machine code (a binary splodge of instructions and data)
- low level languages like assembly which are as close to being machine code (and therefore usually more specific to the hardware/cpu its running on) but where the instructions are not binary values but short abbreviated words, like jmp, mov, etc. High level anguages that are NOT interpreted (C/C++ for example) can get decompiled back to this level. Those that are interpreted (a .Net language or Java) can be decompiled either back to 'source' or an 'intermediate' language that is higher level than this.
- machine code; the final raw code that can be executed by a computer. Not practical for coding/editing with in a computing environment at all, but very practical for the computer itself. Instead of the instruction text 'jmp' you may just have '8', instead of 'mov' you may just have '12', etc.
Even the original coder who applies obfuscation before the code is compiled would not be able to get it back to the original source code form through decompiling (because if he could, anybody could), but only by retaining a copy of the original source code. It's still a program mind you, and works as it was written, it just looks fugly and you lose the context that is given by the original names of things.
There is pretty much nothing, short of putting your code inside a chip that will self-destruct when tampered with, that can prevent it from being decompiled from machine code to at least assembly, and this can be readable enough for avid hackers and reverse engineers to debug and modify (many viruses and trojans understand this in order for them to piggy-back onto applications and spread, therefore their writers will understand assembler and read/write it too). Whether it's worth the effort or not depends on what's at stake.