This is based on 3 different companies, of which all had decent developers who did follow good practices.
This is based on 3 different companies, of which all had decent developers who did follow good practices.
This is 100% true for medium to large codebases. Also because of the dynamic typing just looking at the codebase, it is very hard to understand the "shape" of variables and data. Of course this is improving now because of the type hints, but still it is comparatively hard.
And is it in, let's say Java, with several inheritance levels and very opaque types? It's one thing I struggle with
Sure you know a TypeA has method do_stuff() and returns a TypeB but what actually is happening, beats me. Then you chase down TypeA and find out the actual implementation is spread across TypeA0, TypeBaseA and you can't make sense of anything
That was about plain Java. Where it stops working is some "dependency injection" frameworks which jumped the shark and stopped being about dependency injection (cough Guice cough). A fracking argument to a method comes from god-knows-where because The Framework injects it based on a combination of its class and and annotation? Yes, now it is as bad as Python or maybe even worse :)
All that being said, the by far most common cause of bugs in Python is None in my experience, not any of the shenanigans the language allows you to do.
Mid-sized (5k < loc < 100k?) can absolutely survive a complete "hostile takeover" from new developers, with all the same potential (but not mandatory) issues and pitfalls that pretty much any such codebase invites, in particular in dynamically typed languages.
Also, being boring to write means you seek ways not to write so much, which is also good :)