The dry definition of what Reverse Engineering is
... the process of analysing software in order to recover its design and specifications.
makes me sick. The statement is, of course, right, but it misses the point. In my eyes, Reverse Engineering is first of all learning. Learning the way things are built on the low level. Learning new programming approaches. Etc. etc. etc.
Reverse Engineering may be considered a "conversation with a developer". Very closely resembling a meeting with a psychologist - he/she can't help the patient, unless having a clear understanding of what is going on in patient's head, same way, a reverser can't fully reverse certain piece of code (or will, at least, face significant difficulties) unless he/she is able to see the way the author of the code was thinking.
Reverse Engineering is, above all, the Art and every reverser must seek perfection.
The ignorance in everything that relates to Software Protection is amazing. Vendors tend to use out-of-the-box solutions (which, let's be honest, do what they are intended to), which results in something like using a bulldozer for digging a hole in a sandbox - there is a hole at the end, but is it the one that was planned?..
Another common approach is data obfuscation. No doubt, this may produce good results, but definitely not when leaving the algorithm in an obvious condition, floating on the surface of all the obfuscation.
Customization of existing solutions or, even better, custom solutions would be a better direction to look in.