I think you might be mixing Arduino programming with plain AVR programming.
Arduino boards, which are based on ATMega328P (not the only one microcontroller (MCU) they use, but probably most popular) comes with a bootloader pre-programmed. This opens a method for self-programming MCU on the remaining flash memory with UART method. With this (i.e. via bootloader) you can use any USB-UART converter (like CP2102) to flash user program to it.
On the other hand plain ATMega328P MCU doesn't comes with a bootloader itself. And you can't flash it with just a USB-UART bridge. It has SPI interface (and some others, which are rare to be used) for programming. You have to use some AVR SPI programmer to flash it.
If you want to get started with AVR MCUs I strongly suggest you getting some kind of such AVR ISP programmer (or build one yourself) as some of the projects require flashing so-called fusebits to get some things done. And this can only be achieved with AVR programmer, you can't change fusebit from bootloader (via USB-UART). But be careful with those. You can easily "brick" (recoverable with additional hardware) your MCU by flashing wrong fusebits.
One example of such programmers which are quite common, cheap (both built & DIY) and opensource of such programmers are USBAsp. It's not the best one - it uses software USB stack, but it works. Still you may try finding others with better specs.