As a teacher in the later programming courses of our university programs, I often get a bit worried about what the students perceive that they are doing. Often they do not know how to apply very basic general design patterns even after several courses. Instead they get very concerned when they hear that they are not allowed to use any of the convenient libraries they have already used or at least heard of. The libraries would of course have made the task much easier in the current course.
I don't know how to program in Python, I have only used Java!
My first question to them is: "OK, now you know how to use library X in programming language Y to accomplish solution Z, so how do you do the same thing in programming language Q?" They look at me and you can see the consternation in their eyes. They don't understand what programming language Q has to do with the issue. SERIOUSLY!
When I point out explicitly that there is no such library for Q, they reply: "I don't know how to program in Q, so I prefer to use Y instead." This makes me pretty terrified, since I know that the main difference between Y and Q is merely syntactic, and sometimes even just syntactic sugar.
I am an old timer with 30+ years of programming practise, and with experience of using BASIC, LISP, Pascal, Assembly languages, Prolog, Smalltalk, C, ML, Ada, Java, Python, JavaScript in my portfolio (no, I don't know COBOL, unfortunately!). I do understand the Turing machine and have made programs for it as well.
However, what I realised very early in my career was that there is a vast difference between programming and coding. And what the students still learn today is mostly coding in the different languages. When you ask a student who knows Java to develop a program in Python for their thesis they protest. "I don't know how to program Python" is the common answer, to which I hasten to reply: "But I hope you have learned how to program?". Mean reply, I admit, but also important.
If they know how to program, they can learn the coding in two, to three weeks, no more!
They don't seem to have absorbed the principles, but rather the specific code snippets that solve the problem in the specific language they use. But this leaves them almost helpless when they are asked to use a different language. As I see it, if they know how to program, they can learn the coding in two, to three weeks, no more.
A programmer's skill and expertise should not be in the language they use but in how they solve the problems. If they only learn to use special libraries they don't learn the programming skills anymore.
My favourite example of what I mean is from my father's later work, where i happened to witness the following episode. My father retired from the position as chief gardener at the largest botanical garden in Stockholm. He started his career as a learner at the same garden, weeding, digging, pruning trees and all those very basic things you have to do as a gardener. He worked himself up over the years, and as chief gardener he was mostly dressed in suits at work.
At the time of this episode, he was showing a group of visitors from Japan around the garden, when they came past an area where they were arranging a new set of planting areas from scratch. He looked at the digging and stopped immediately. "This is not OK! It should be at least 50 cm deep, and the edges have to be straight!" The gardeners replied: "This has been a lawn. The ground is hard and full of stones. It's not possible to dig this deep with spades. We would need a digger!".
Instead of insisting, my father took of his jacket and asked one of the visitors to hold it, took the spade and dug almost a meter along the trench. Then he took his jacket and said: "This is how I want it done! Proceed!", upon which he left without another word.
The point here is that he could probably well have told them to use a small digger, but what the gardeners showed was bad practice. With the action he showed not only that it was possible, but also that he knew what he was talking about, even though he was the boss dressed in a suit. He knew the basic activity needed to get the job done.
So, what does this have to do with programming? A lot, actually! If a programmer does not know how the basic handiwork of programming works, he or she will not produce good code in the end. Furthermore, if he or she becomes project leader, the credibility is very quickly reduced if he or she cannot display a deeper understanding of the problems that appear in the coding.
A boss or, as in our case, a project leader needs to have basic knowledge about the handiwork in the domain, otherwise they will not have any credibility among their work staff. They need not be experts but they have to know what they are talking about. So, again, why do I worry? The students are good at Java, when they leave. Isn't that what they need?
No, that is not enough. In five to ten years Java may be just as obsolete as BASIC and COBOL are today. However, the pure programming skills will probably be needed more than ever. And currently the students that leave us have better knowledge about the various libraries they can use in a specific language, than of how to solve the same problems that the libraries do for them by hand. This, I think, will most likely be a big problem in the future programming projects.