Given the recent transition to ubiquitous parallel computing, which “programming models and approaches” should be incorporated into the undergraduate computer science curriculum?
I have a simple response. The programming model doesn’t matter as long as the focus is on industry standard models people actually use. And the approach used must stress mapping algorithms onto the details of a computer’s architecture.
Before “functional programmers” and other “abstraction loving lunatics” start foaming at the mouth, let me provide some background to my answer. First off, my target is computer science undergraduates. As educators, we have a duty to prepare them for the labor market they will face. And the fact of the matter is, external factors dictate the programming model; not the preferences of the programmer. Hence, a professional programmer must be flexible and able to make progress with any model that is available. And as the famous essay “Worse is better” makes abundantly clear, “portable and available everywhere” wins over “elegance” any day.
What sort of programming will today’s computer science undergraduates do? There is a clear trend towards what I call “domain specialist programmers”. Animators will build their animation applications. Biologists build their genomics workflow software. Business analysts build their data analytics applications. High level languages/frameworks such as Python and Matlab will let domain experts create the software they need.
Will this make computer scientists irrelevant? It will if they are “high level abstraction junkies”. If the domain expert creates their applications, what will computer scientists be needed for? The computer scientists will be needed to (1) create the high level languages/frameworks used by domain experts and (2) map the components of those frameworks onto specific architectures.
It therefore follows that we should teach our computer science undergraduates more about computer architecture, less about fancy new programming models, and more about how domain experts will architect software. And the right way to teach software architecture is to focus on the design patterns relevant to key application domains.
Design patterns and how they map onto computer architecture are the key. Programming models are a distraction and a boring implementation detail. A professional programmer must be able to move back and forth from one model to another based on the needs of a customer. So let’s teach the subject that way to our undergraduates. Teach computer architecture first. Teach design patterns second. And then show how to map these patterns onto the details of real computers using multiple, portable, industry standard programming models.
If you have stumbled on this article via Google ot another search engine -welcome. This is the continuation of Dr. Tim Mattson's position piece for IDF 2011. See the article in context here.