If Apex had a "singular" purpose then they wouldn't have built it as a turing complete generalized programming language.
And the reason you need namespaces is for basic code organization. Classes organize functional objects with a module of code, namespaces let you're break code into modules.
If you have two distinct modules of code, each with their own logger class you suddenly have a confusing naming conflict with both loggers being exposed everywhere (or forced you to rename one).
So then it forces you to try and name your classes like RenderingLogger or Service_Logger and then you very quickly run into the fact that Apex imposes arbitrary length limits on class names.
If you're writing a simple db access script then whatever, it can get the job (worse then other languages but it can). If you're actually trying to build a proper application like you publish on AppExhange then it's shortcomings become apparent everywhere.
Hell it didn't have a reasonable unit testing framework until a side project from some devs introduced Apex Mockery, and it still sucks compared to Mockito and actual professional testing frameworks.