They should not just learn C++ but Assembly, C, C++, C#, Java. Assemply gives them a real sense of what is going on "Under The Hood". C provides them with an understanding of memory management and risks asscociated with improper code that has leaks and is open to Buffer Overflow attacks. C++ gives them the understanding and usefullness of libraries and complex graphics. C# and Java teaches OOP
I think there is value to understanding how the underlying machine works. Never know when it might come in handy. It also gives students a taste of embedded systems. We still need people who do this.
The beauty of a course on 2600 development is the machine itself. Designed in the early 70's, it has only 128 BYTES of memory and no video shifter, so you have to sync with the video hardware in code. It will definitely provide a good lesson in software wedded to the hardware, as well as learning to design for economy.
I am absolutely sick of recent CS graduates (some with a masters)that cannot write code. Outside of academia and perhaps the national labs they have no commercial value as delivered by the university. Yes, it is nice for people to have a good foundation in the "know why" of CS, but they need some "know how" to go along with it.
All their "knowledge" about information theory, data structures, and algorithms is pretty much pointless when making commercial software. They don't have enough math, physics, or chemestry to be useful in developing new methods and without any "know how" they are drain on financial resoruces.
I had the same experience, but <b>you</b> should teach them how to 'develop' good code. Just studied electrical engineering, I had to learn PLM, Petri nets, modular programming and understand company written multi tasking operating systems more then 25 years ago. Only possibly because I had very good teachers with enough time and patience, no chance to do it by my own with the knowlegde coming from university.
Pointers, data structures, object oriented programming, memory management, and the inner workings of computers are all subjects that are independent of the C++ language. And if you want to work for a longer time as software developer, you will have to learn them no matter by which programming language.
C++ is a very wide spread language and well suited to learn about all those concept. To work for some time with assembly language would not hurt in addition.
So yes to C++, in my opinion. Most of us will have to learn C++ anyway, so why not in the beginning.
Nowadays student are becoming just Programmer than Computer Engineer. IMHO though while developing software people should think about abstraction but they should know internals about OS and other intricacies.
You don't learn these things from C++. Let them learn assembly.
Nevertheless, they should learn C++. Because it's a widely used language, on which many others are based. If they want to switch to C# or Java or PHP even, they could do so easily. Switching the other way around isn't easy.
I worked extensively in Assembly before moving onto FORTRAN, Visual Basic, and then C#. I needed to understand these technologies when I was working in assembly. Since then I have had little need to understand these concepts. So I say no, it is not important. In developing business applications it is less necessary. However, I think that it is good to understand these concepts to be the best developer; it is part of understanding the theory of computers and software. There is also the advantage of understanding these concepts if there is a possibility that the developer will be involved in lower level programming.
C++ isn't C. Good modern C++ code shouldn't contain any pointers or manual memory management.
If the question is "should programmers learn C concepts using C++?", then my answer is no - they should use C to learn C concepts. There's no need to add additional complexity by using C++.
But learning about C concepts certainly is important, without them you simply cannot understand how your code in the higher-level languages actually works.
You can write plenty of C++ code just using stack-allocated objects (types like std::string and std::vector may end up on the heap, but that's an implementation detail and not relevant for the programming model).
In case you need pointers, either std::unique_ptr or std::shared_ptr should do the job. Classic C pointers with manual memory management simply shouldn't occur in C++ code.
There is almost no other way to understand some principal things about how computer works.
If you don't understand how computer works, then it's magical box for you. Then you write "magical" code for it. For example: http://en.wikipedia.org/wiki/Cargo_cult_programming , but there is much more.