Uploading code to ATMega328p SMD

ISP/ICSP seems to be the way to go, but what's this all about? What do I need in order to do that? Is This guide any useful or I need more?
Also I don't understand if I need to burn the bootloader or not. How is my MCU supposed to understand the Arduino code if there's no bootloader?
Thanks