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.
C++ is still widely used in real-time embedded systems. Besides, understanding the concepts is important when testing and debugging manage code like C# or Java. Granted, some developers can get by without that knowledge, but career-oriented software engineers need to know the whole stack.
Depends on the job.
I doubt a company hiring for a firmware builder gives 2 hoots about .Net experience.
In fact, from what I have seen it is harder for a programmer that learned from top down to pick up on lower levels. i.e. a programmer that begins with VB or C# has more difficulty picking up on C++ and C than one who started with C or C++ and then moves on to C#.
If the employer knows that and is desperate, they will likely hire a kid right out of school so long as they know some C and C++ over a .Net that did not learn any, given a requirement of such on the job.
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
it is harder for a programmer that learned from top down to pick up on lower levels
I learned from the top down, and I found it helpful. Starting at the top you learn more easily how to make programs, and as you move down you learn more about how the black boxes in the next level up work. Start abstracted, and get more specific as you go.
Plus I see the trend in people who start in lower level languages and move up of trying to write certain functionality yourself before checking if that language's libraries already include it.
1) super- low level assembler language
2) low level language (C)
3) high- level language (Java, C#, or C++)
4) one scripting language (Java Script, VbScript, Perl, to name a few)
5) one web language (HTML)
That way you gets a feel of not only the inner(lower), but the middeler(mid leve) and outsider(high level) of progamming.
"Program testing can be used to show the presence of bugs, but never to show their absence."
I think C and C++ should be grouped together, especially considering you can write C in C++ more or less (I've never really learned C, but I have written C programs based entirely on my knowledge of C++). At the very least, I really don't think it compares directly to C# or Java.
So c++ is defined as a intermediate language. It contains features of both low- level and high- level languages. Technically speaking it sits just after c and just before java on the Language Spectrum of Science scale you can see if you follow the link below. I do feel that the fact that it is a OO language, that it should lean more towards Java when it comes to the learning of a language.
In addition, it is very valuable to learn functional languages like scala or prolog. If exposed only to procedural languages your thinking gets scewed to one direction. One of my favourite books at uni was a book on scala.
Without an understanding of what's really happening underneath it all, programming is just playing with blocks. I'd actually go further and suggest that students learn C and something about compiler technology. That'll help them appreciate all the amazing frameworks out there and what they provide. It also may prevent them from standing around like deer in the headlights wondering what's going wrong when something unexpected happens in a framework.
I didn't study anything computer related myself, but I know several people that did and they all come with the same story: "We had to tell our professors what was going on...". Or professors that still used some prehistoric software because it was all they knew etc. I studied media and my professor didn't know the difference between a Flash application and a YouTube vid (wildly clicking on YouTube vid: "Why doesn't it respond!?")... Perhaps you could get away with teaching the same stuff every year in math or English class, but NOT in programming class.
How can we be educated if the educators don't know?
Anyway, I think every programmer should know a thing or two about memory management, pointers, that kind of stuff.
Most of programming teachers even don't know C#, and only the basics of C++. At school we only learn Pascal. There is no question about learning memory management, pointers, or even OOP. If somebody wants to be a real programmer he/she have to learn the most alone. One of my friends is at university, and they've learnt assembly, only 16 bit assembly...
In my school we are still using Office 2003, because the teacher says that we won't be able to use 2010. There still Windows XP on every computer. And if a programming teacher learn only in this level, will he teach the same after he finished school?
If somebody wants to be a real programmer he/she have to learn the most alone.
An intern who is still at school told me the same
Dávid Kocsis wrote:
In my school we are still using Office 2003, because the teacher says that we won't be able to use 2010. There still Windows XP on every computer.
Heard that before too.
I know some people fresh out of programming school who don't know OOP. I even read a master thesis that started like "for our final project we are using the Microsoft method, which is object oriented." (yes, you didn't know Microsoft invented OOP!)... The application that went with it did not use inheritance, interfaces, design patterns... It's a joke!
And I get looked down on because I don't have a formal education
I originally started with FORTRAN, essentially self taught, and seriously mastered VAX FORTRAN. SOmehow I got involved in learning to use the VAX MACRO-ASSEMBLER, primarily making functions that didn't currently exist as the learning tool.
But what an eye opener!
FORTRAN promotes numerical values (at least at that time) without a wince. Little did I know the damage I was doing to my calculations (padding, truncation) until I saw what was happening. Similarly, just seeing the consequences of arguments (pushing/popping stack) taught me when to use global declarations by knowing why.
Perhaps there's no need to go all the way to an assembly language, especially since they're so processor specific, but by going to C or C++, you still get the connection to reality that what you do and how you do it has consequences not only in performance but in the actual final calculation.
If one does plan on doing this stuff for a living, they probably should know that stuff.
"The difference between genius and stupidity is that genius has its limits." - Albert Einstein
"As far as we know, our computer has never had an undetected error." - Weisert
"If you are searching for perfection in others, then you seek disappointment. If you are seek perfection in yourself, then you will find failure." - Balboos HaGadol Mar 2010
At first I thought "yes" they should absolutely be coming out of a CS programming with an understanding of some lower level languages.
Then I thought, "no, not c++", they should be even lower.
Now I think they should learn a lower level language (something I haven't done and am unlikely to do) as part of their CS program, but it doesn't have to be C++. That's like saying they should definitely learn C# as the higher level language. They should learn a higher level language, but it doesn't matter if it's C# or Java or something else (just not VB for the sake of all things holy).
So, yes to low level programming, yes, to high level programming, but the language doesn't really matter, so I ended up voting no.
Last Visit: 31-Dec-99 19:00 Last Update: 26-Nov-14 13:48