0
For me personally is multi threading, which can get extremity complicated because an application that takes advantage of the multi (physical and virtual) core CPUs need to constantly check the status of the different processes running "at the same time", in order to avoid difficult to debug behavior, and one status can change many others and so on, hurting performance and even the system running the application. Threads are an important part of almost every great application (in my opinion), and this is why every programmer should at least know them.