While coding is seen as a tool to create software, programming can be seen as the process of taking code to a point where it can produce the intended machine level output. Programming is regarded a superset of coding, and is the primary function of a Software Engineer.
It normally takes much more time for an individual to become a qualified programmer than a coder, and this usually requires an understanding of many underlying technologies. Hence a lot of programmers are usually proficient in a number of different languages and have a fundamental understanding of the relationship between conceptualisation and implementation. A good programmer should be able to recognise the most useful software and technology stack needed in order to complete a task.
Like coding, the best way to become a proficient programmer is getting your hands dirty, and to become engaged with different projects through the use of different technology stacks. By working in many different environments the learner will be exposed the surrounding technologies and gain a deeper understanding of the entire process.
“Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.” - Eric Raymond
It is important to note that a formal computer science degree is not necessarily the best way to become a good programmer. Many of the most prolific software developers achieved a considerable amount removed from any academic or professional environment. Take for example Apple’s Steve Wozniak, who is an entirely self taught developer and now world-famous for his work on the Mac operating system.