A bootloader is a code that is executed before an Operating System, or in the case of an Arduino, before your program starts to run. The concept of bootloaders is universal to virtually all electronics such as laptops, smartphones, and other devices. A bootloader package the instructions to boot the system kernel and most of them have their own debugging or modification environment. As the bootloader runs before any piece of software on your device, it makes it extremely processor specific and every Arduino chip has its own bootloader. Many makers out there will never need to change or program their Arduino’s bootloader. Some, however, will be forced to do this.
One reason to program the bootloader might be that, when using the device, the user did something wrong that damaged it. Perhaps the company forgot to program it at factory level, or perhaps the user burned the Atmega.
Another reason to do this is if the user needs to set different fues. They are essentially configuration parameters, or like the chip’s BIOS. They control functions like which oscillator to use, and what speed to run at (i.e. the internal 8MHz oscillator, or an external crystal), brownout detection, and the size of the flash.