I'd just add what ataradov said is especially valid for prototyping. Developing microcontroller code (like any programming) is an iterative process. You add some code, you compile it, upload it and test it. You fix it and when it finally works, you add some more. Rinse and repeat, ad nauseam. When testing, you want your microcontroller in its target circuit, not floating in the vacuum. Ok, there is a software emulator in Atmel Studio, which is cool, but I can't picture how one could develop anything but the simplest of programs relying on this only, without the possibility to check the physical uC's behavior in the real circuit. Additionally, with Atmel-ICE you get a debugger functionality which you can use to break/resume the program flow at specific points (even conditionally), peek at the variables and registers and many other cool things. Even in the past, you wouldn't usually just move the micro between the programmer and the device under development back and forth with each added line of code. There were emulators (hence why modern debuggers are still sometimes being called that) which plugged into the microcontroller socket and emulated the microcontroller's behavior in circuit with the aid of a PC software. Now, it's the hardware debugger which, utilizing dedicated debugging circuitry found in modern MCUs, takes control of the real physical MCU's program flow.