Programming is just problem-solving. If you can take a problem, break it down into steps, and devise a process for solving it, you've already done most of the work and the code is just a formality.
I've found that people who only know how to code in one language start to approach all their problems through the lens of that language's limitations and conventions. It makes it very, very hard to solve problems the language isn't suited to, and difficult to learn other languages at all because you lack the theoretical background to reduce a problem to that level of abstraction.
To point (ii), I hate questions like that. While it pays to know the "gotchas" of any language you're working with, not knowing them doesn't make you a bad programmer. It's not the programmer's fault that a language does something non-intuitive or outright brain-damaged. Ideally, you just fix the code to work the way you want and put a comment next to it, indicating why you had to write such a workaround in the first place.