What is the device? 16F????
From what I have read, there is no protection in the way you write the software. If someone is doing a straight 100% copy of you code, nothing is going to help you with that. There are lots of tricks to be used to slow down or prevent disassembly, but then again the determined hacker will always win.
As for the hardware side, make sure the lock bits are programmed (this is obvious).
When you design the circuit there are some tricks to slow the hacker down:
You can file off any chip markings.
You can also change standard pinout on the board.
3 or 4 layer board with important tracks in the middle layers.
I once burned an unused pin so that reprogramming or entering programming mode was impossible. The device still worked reliably, and may still work to this day as far as I know.
Others will tell you not to do this, but if you have no choice, then take your chances and try to burn the pin without destroying any other internal components on the micro. I used a 12VDc wall wart hooked up in reverse polarity to the pin and GND ***after it was programmed and LOCKED of course***
There are lots of good articles to read, try to google "embedded design security".
One last thing, how much $$ do you want to spend on your design or product?
IF there is no limit, then use a secure microcontroller. I believe that you get what you pay for. Some Maxim/Dallas products are just too secure for the average hacker, and would deter most people from cloning your device once they find out what the cost in reverse engineering a secure microcontroller. After all, you could just pay someone to write the code from scratch rather than pay to a reverse engineering company to read the locked device.
The determined hacker will always get it, no matter what. Whether or not you code worth the cost, is up to the designer. Making the reverse engineering process difficult can slow down or even force the hacker to give up.
Good Luck