There are two main problem domains you tackle when sitting down to write code:
- The real world dilemma being solved with software
- How to explain the solution to the computer
The first problem takes most of the brain power. Eliciting requirements for the software from complex shifting sands. Coming up with the right design and architecture for robust and reliable systems. How to reverse a linked list. Before anything can be written in code, the author must be able to wrap their heads around the solution, at least to some degree. Sometimes, experimentation is needed to get across the finish line.
Once the coder can wrap their head around what must be done, they face the arduous obstacle of convincing a metal box to do it. They’ll often use a programming language to express their needs to the machine. This is a compromise the machines and humans have agreed upon, to both do a bit of work to learn how to speak a common language. There’s a translation cost. Humans must convert the solution from their native spoken tongue to the code language, which the computer must take and eventually convert to 1s and 0s (unless you code in binary, you monster). As the language is used more and more, it becomes easier for both parties to communicate.
Since we’re talking languages, when is fluency reached in a programming language? Is that a real thing?
The answer may depend on who you ask. Once you know all keywords? Some of the standard library? All of it? Are you fluent when you can cite the language spec and parse the language grammar into a fancy AST?
I suggest that fluency is reached when the second problem domain goes away. It’s no longer a challenge to express what one wants to the machine. The brain has internalized and/or done away with the cost of translation. Thoughts are casted in molds whose shape is influenced by what the language can express and only the Main Problem is battled, not communication. It’s similar to spoken languages: You don’t need to know every English word, every obscure grammar rule, or every idiom to be an excellent English writer.
Once fluency is reached in a first language, productivity with software will dramatically increase. I urge other programmers to try and fully learn one language at some point, as opposed to lightly dabbling and being useful in several. Take the time to dig deep!