- Inadequate or high-effort tools. This is half the challenge of the embedded world, and the cause of "I've destroyed my tools with my tools!" https://www.usenix.org/system/files/1311_05-08_mickens.pdf
- Complicated business requirements ("do this every second Tuesday if there is an R in the month, but not if the customer is using the US VAT system and not if the product is a type of cake")
- Critical system requirements (remember, using Java to control your nuclear reactor violates the license). People working in this environment can easily get elitist about it, until you look at their code and find Toyota spaghetti.
- Problems that require Actual Maths or Actual CS, with known solutions. Rare in the webdev world until someone remembers about ACID; more common in the embedded world if you need control systems.
- Problems with unknown solutions. Actually extremely rare; often the first line of attack involves Matlab or Excel or some other "not real programming" technique. Often the smart domain experts you need to solve the problem are not also very good at software engineering.
IME the first two take up 80-90% of the working day. The third is only applicable to some industries.
Different people are better at different types of challenge. This doesn't matter unless you're trying to construct some sort of total ordering over human beings in order to feel better about yourself.