In the end, C++ is a valuable skill for a number of areas - 3D, games, driver development, etc. However, for most web development it's almost useless, and there are a LOT of web development roles around. Equally, a lot of the bespoke business development requirements (which also account for a significant proportion of real-world vacancies) are generally more focussed on database accessing and so on.
You look at Slashdot and the like and you could think that you should learn Ruby and C++, but if you're mainly thinking about a career, the thing to really to is to look at the job market in your area and see what skills are actually in demand.
Like you I've learned some C++, and have a reasonable understanding of memory allocation and so on, but am not as comfortable with pointers as I'd like. In practice, I've had to stay away from a couple of bits of code at companies I've worked with, but it's not been an issue. VB, ASP and.NET skills have been the main things I've needed, and, looking around, most of the well-paid jobs in my area are more interested in.NET (C#) than C++ now anyway. I more want to be more comfortable with C++ for my own sakes than because it's required for my career. Just as I want to know more about Python and Ruby (especially Ruby at the moment, since I like various aspects about Rails) for personal satisfaction rather than for career reasons.
Of course, if you want to get into games development, then learn C++. Learn to use DirectX and so on. Focus on those skills. You may be able to get by with XNA and C#, but it's cutting off your options.
If you just want to code for a living, and the salary on offer is more important than the particular focus of the development, then feel free to focus on Java or C#, as there are plenty of well-paid jobs which don't need any pointer referencing and dereferencing, ever.
What I can say is that employers seem to prefer someone who is really good at the skills they regard as key, rather than having all of the nice-to-haves. I've been something of a generalist, picking up C++, VB, C#, Python, Ruby, Javascript, Java, PERL, PHP, Delphi, PROLOG, etc. Even working on existing code in an unfamiliar language on occasion (being a generalist does at least help you hit the ground running with an unfamiliar technology). The existing employer valued the skill, but when it came to interview time for the next career step, most of the skills were irrelevant to the employer. A solid focus on a solid, narrower skill set (e.g..NET/C#) seems more valued.
As noted by others, database skills are in demand for many development roles so rather than worrying about whether you've learned enough programming languages, making sure you're good with either SQL Server or Oracle is more useful for maximum job choice. Don't worry too much about missing some areas of knowledge - you can't learn all languages in full depth. And you'll still have a lot to learn (and the bar keeps moving, so there's always more being added to the 'stuff to learn' list).
While you're looking at the step from studying to employment, give some thought about what you CAN bring to the table for an employer - at the end of the day, one of the developers I know that would have the hardest time getting a job is probably one of the best coders I know... their interview skills are useless, while one of the worst developers I've met had no problems getting a job... you need to sell what differentiates you to the employer, and once you have that first development job, then you can work out what you really need to improve on for that role. Worrying about what bits you might need to know is not necessarily productive, because different industries have very different development requirements.
There's long been debate about developers calling themselves Software Engineers, because the level of knowledge expected is generally rather less complete. Speaking as a developer, I don't think it's a particularly suitable title, for that kind of reason. I trust my life regularly to the designs of engineers, but a number of developers I've met and whose code I have worked on have not had remotely equivalent standards and understanding. I can list only 2 developers I've worked with who I would definitely want on my team if I was assembling one, and at least 3 whose code I would probably never trust unless fully vetted by someone else.
Having said that, with regards understanding the separation of domains of computer science understanding, perhaps I chose a bad example - in Computer Science there are many different models for analysis, different (and conflicting, sometimes) models for design, more languages than you could realistically cover, plus knowledge of hardware, device I/O, networking, maths and logic, and so on. In the first year you'd cover a couple of programming languages, and still not have an in-depth knowledge of all of the main libraries around for that language, as well as only rudimentary knowledge of systems analysis, related maths, and so on. Many areas would still be untouched.
A good course will give the user knowledge of several programming languages over the 3 years, allowing a focus on particular ones later on to get a solid knowledge of that language. However, it will leave out far more programming languages than it covers, and other areas would be a mix of required courses and electics - e.g full understanding of the main database design and modelling theories, Device I/O and assembly language, maths for more advance 3D geometry calculations, knowledge of multiple design methodologies, AI and Cognitive Science, coverage of web development as well as desktop programs, GUI design principles, mobile device development, etc...
I don't think it is possible to adequately cover the full spectrum in a good depth within the limits of a 3 year course, not when the course assumes no prior IT knowledge. Most developers are therefore specialists - on Desktop (GUI) development, back-end (database, etc) development, Web development, Mobile development, Game Development, 3D, Financial Analysis, device driver or assember... sometimes 2-3 areas, but few developers that I know (with or without a degree) would claim to be an expert in more than a few areas.
A mechanical engineer in whatever field will generally need some understanding of fluid dynamics, chemistry, and so on. A desktop designer doesn't necessarily need any experience with HTML, Javascript, Flash, SOAP, AJAX and all the other technologies that are web-focussed. Most developers will not need to have knowledge of device development. Most developers do not need knowledge of complex AI development or 3D engine development. It's hard enough to find a developer who has a sufficient breadth and depth of knowledge in a particular field, let alone one with a similar understanding of several fields. Some open source luminaries are of course exceptions...
It's where you try to strike a balance. A lot of people object a lot more to government funding for students to study degrees which provide little if any benefit in the real-world job market.
Yes, you need to have academia - as I noted in my previous comment you can have too little understanding of principles which you may only rarely use (and I've worked with some who clearly demonstrated little understanding of the code they blatantly copied out of a book - I kid you not). However, my intended statement was not that universities should focus exclusively on skills currently in demand from businesses. I should perhaps have said 'focussed EXCLUSIVELY on the academic'. It was that for a course to be of maximum benefit to the STUDENT, it should include skills which are in demand, and which improve the students employability and salary potential.
The point about CAD is sensible, but actually promotes my line of thinking to some degree, because the old-school IT courses tend to promote hand-coding over using modern tools to aid the process. And there is an area where there has to be a balance. You should come away with a reasonable understanding of how the user interface, for example, is put together, but in daily use you would be at a disadvantage if you only knew how to hand-code, and not use an IDE to quickly design the interface. The latter is less about understanding the subject and more about using it in the real world, but it's still important.
You are of course right that vocational courses and certificates should be the most focussed on business-essential skills. Degree courses do offer more scope for covering underlying theory. Where the degree needs to be business-led is in using reasonably current languages and technologies. There are very good reasons for learning Java immediately. You can write Java code for your mobile phone, your computer, your Blu-Ray player, for your webserver. While it doesn't teach you pointer arithmetic, there's a very good reason why it is in demand with employers, and that's because it has a use in many places. Another reason it is in demand is that it DOENS'T require pointers - pointers are the ticking time bomb of C programming, because you can introduce fatal memory leaks, security holes and so on by making a mistake using them. Yes, if you need to use them, you need to be able to use them properly, but for most applications a developer could pick a language that doesn't require them. One of my disagreements with the course was that the 2 languages we studied in the first year were C++ and PROLOG. I didn't mind the C++ as a principle, but it skipped using a modern IDE in favour of hand-coding, insisted on coursework using drawing libraries which weren't readily available for a home PC, and so on. JAVA wasn't an option until the 3rd year, and Visual Basic, etc weren't options at all. In terms of academia, it looked at Systems Analysis And Design, but listed things like the Jackson method as a programming-focussed design method, and skipped it to focus on SSADM. Then, the project wasn't to analyse a computing-related requirement, but to model a business instead. It tried to cover academic fields related to Computer Science, but managed to cover them in a manner that seemed almost actively inapplicable to IT employment requirements.
In my opinion, a Bachelors Degree should aim to provide a student with the skills required for employment in that field. That DOES include academic study, because as you mentioned a sound understanding of the theory is required at times to make accurate decisions. It should also lay the foundation for further academic study in the form of a Masters degree or PhD. In those later qualifications I would expect the focus to be more on academia. The reason for this is that a Bachelors degree course is generally the first point that a student can fully focus on a chosen subject of study, and potentially the final point where they formally study the subject, so it has to fully prepare them for focussing their future life and
Most teaching adopts the approach that you learn the easy stuff first, and then move onto harder and harder bits. In teaching Java first, and only teaching ones like C++ later, this is taking much the same approach.
It seems that the argument is essentially about taking the view that you should learn languages like C++ first to get an understanding of all the lower-level concepts, and to look at libraries later. At uni I studied C++ and Prolog, and Java was reserved for the 3rd year.
So I learned a bit about memory allocation and pointers, and now know that I prefer to stay well clear of that - and in fact have been influenced by other academics who suggest that such low-level access to memory is better avoided unless it is necessary. If you need all-out performance, then you may need to do this, but the cost can be obscure crashes, memory leaks, code insecurity, and so on.
I also learned about recursion, learning to work with just a single method for iterating through a list. I still use it when it's appropriate (e.g. when parsing trees of data). However, it also taught me a greater appreciation of the value of having more options - for loops, for each especially (again avoiding invalid references).
Yes, you can learn to use Java to design a GUI using an IDE, leveraging libraries to achieve most of the 'hard' stuff. And you know what, for most business requirements, this is probably the most productive way to code. Minimal reinventing of the wheel. Maximum leverage of tools to enhance productivity.
No, that doesn't give a full appreciation of memory streams, stack vs heap memory issues, hardware I/O, etc. But you're talking about catering for the mainstream. I think the authors are WRONG in saying that a university should be focussed on the academic. The reason people go to university (apart from the social aspects and cheap drink, or dossing around for another few years) is to become more employable, and to earn more. They don't achieve this by learning skills which are in minimal demand in a real world workplace. As a result there should be a balance between the academic aspects and the more employment-friendly ones.
Learning to use an IDE and use toolkits also allows the developer to focus on things like the User Interface, something which is often severely overlooked, and relatively incidental to the final design. Rather than criticising teaching a GUI-focussed course, this should be encouraged as part of a complete education, covering essential skills that are often missing from an academic course.
I've known a brilliant mathematician and developer who has worked on a number of commercial games, but who took some time to get anywhere because they haven't got the skills in user interface design. Equally, I've know various developers with a shaky grasp of logic and maths, who created a nice GUI and couldn't get the code behind it working right. So yes, there is a place for mathematics and learning the details that require more thinking, because you have to sort the chaff from the wheat.
It's a typically academic article - in that it presents the authors particular biases as fact, and one which doesn't necessarily mesh academic utopia with commercial realities sufficiently.
In the end, C++ is a valuable skill for a number of areas - 3D, games, driver development, etc. However, for most web development it's almost useless, and there are a LOT of web development roles around. Equally, a lot of the bespoke business development requirements (which also account for a significant proportion of real-world vacancies) are generally more focussed on database accessing and so on. You look at Slashdot and the like and you could think that you should learn Ruby and C++, but if you're mainly thinking about a career, the thing to really to is to look at the job market in your area and see what skills are actually in demand. Like you I've learned some C++, and have a reasonable understanding of memory allocation and so on, but am not as comfortable with pointers as I'd like. In practice, I've had to stay away from a couple of bits of code at companies I've worked with, but it's not been an issue. VB, ASP and .NET skills have been the main things I've needed, and, looking around, most of the well-paid jobs in my area are more interested in .NET (C#) than C++ now anyway. I more want to be more comfortable with C++ for my own sakes than because it's required for my career. Just as I want to know more about Python and Ruby (especially Ruby at the moment, since I like various aspects about Rails) for personal satisfaction rather than for career reasons.
Of course, if you want to get into games development, then learn C++. Learn to use DirectX and so on. Focus on those skills. You may be able to get by with XNA and C#, but it's cutting off your options.
If you just want to code for a living, and the salary on offer is more important than the particular focus of the development, then feel free to focus on Java or C#, as there are plenty of well-paid jobs which don't need any pointer referencing and dereferencing, ever.
What I can say is that employers seem to prefer someone who is really good at the skills they regard as key, rather than having all of the nice-to-haves. I've been something of a generalist, picking up C++, VB, C#, Python, Ruby, Javascript, Java, PERL, PHP, Delphi, PROLOG, etc. Even working on existing code in an unfamiliar language on occasion (being a generalist does at least help you hit the ground running with an unfamiliar technology). The existing employer valued the skill, but when it came to interview time for the next career step, most of the skills were irrelevant to the employer. A solid focus on a solid, narrower skill set (e.g. .NET/C#) seems more valued.
As noted by others, database skills are in demand for many development roles so rather than worrying about whether you've learned enough programming languages, making sure you're good with either SQL Server or Oracle is more useful for maximum job choice. Don't worry too much about missing some areas of knowledge - you can't learn all languages in full depth. And you'll still have a lot to learn (and the bar keeps moving, so there's always more being added to the 'stuff to learn' list).
While you're looking at the step from studying to employment, give some thought about what you CAN bring to the table for an employer - at the end of the day, one of the developers I know that would have the hardest time getting a job is probably one of the best coders I know... their interview skills are useless, while one of the worst developers I've met had no problems getting a job... you need to sell what differentiates you to the employer, and once you have that first development job, then you can work out what you really need to improve on for that role. Worrying about what bits you might need to know is not necessarily productive, because different industries have very different development requirements.
There's long been debate about developers calling themselves Software Engineers, because the level of knowledge expected is generally rather less complete. Speaking as a developer, I don't think it's a particularly suitable title, for that kind of reason. I trust my life regularly to the designs of engineers, but a number of developers I've met and whose code I have worked on have not had remotely equivalent standards and understanding. I can list only 2 developers I've worked with who I would definitely want on my team if I was assembling one, and at least 3 whose code I would probably never trust unless fully vetted by someone else. Having said that, with regards understanding the separation of domains of computer science understanding, perhaps I chose a bad example - in Computer Science there are many different models for analysis, different (and conflicting, sometimes) models for design, more languages than you could realistically cover, plus knowledge of hardware, device I/O, networking, maths and logic, and so on. In the first year you'd cover a couple of programming languages, and still not have an in-depth knowledge of all of the main libraries around for that language, as well as only rudimentary knowledge of systems analysis, related maths, and so on. Many areas would still be untouched. A good course will give the user knowledge of several programming languages over the 3 years, allowing a focus on particular ones later on to get a solid knowledge of that language. However, it will leave out far more programming languages than it covers, and other areas would be a mix of required courses and electics - e.g full understanding of the main database design and modelling theories, Device I/O and assembly language, maths for more advance 3D geometry calculations, knowledge of multiple design methodologies, AI and Cognitive Science, coverage of web development as well as desktop programs, GUI design principles, mobile device development, etc... I don't think it is possible to adequately cover the full spectrum in a good depth within the limits of a 3 year course, not when the course assumes no prior IT knowledge. Most developers are therefore specialists - on Desktop (GUI) development, back-end (database, etc) development, Web development, Mobile development, Game Development, 3D, Financial Analysis, device driver or assember... sometimes 2-3 areas, but few developers that I know (with or without a degree) would claim to be an expert in more than a few areas. A mechanical engineer in whatever field will generally need some understanding of fluid dynamics, chemistry, and so on. A desktop designer doesn't necessarily need any experience with HTML, Javascript, Flash, SOAP, AJAX and all the other technologies that are web-focussed. Most developers will not need to have knowledge of device development. Most developers do not need knowledge of complex AI development or 3D engine development. It's hard enough to find a developer who has a sufficient breadth and depth of knowledge in a particular field, let alone one with a similar understanding of several fields. Some open source luminaries are of course exceptions...
It's where you try to strike a balance. A lot of people object a lot more to government funding for students to study degrees which provide little if any benefit in the real-world job market.
Yes, you need to have academia - as I noted in my previous comment you can have too little understanding of principles which you may only rarely use (and I've worked with some who clearly demonstrated little understanding of the code they blatantly copied out of a book - I kid you not). However, my intended statement was not that universities should focus exclusively on skills currently in demand from businesses. I should perhaps have said 'focussed EXCLUSIVELY on the academic'. It was that for a course to be of maximum benefit to the STUDENT, it should include skills which are in demand, and which improve the students employability and salary potential.
The point about CAD is sensible, but actually promotes my line of thinking to some degree, because the old-school IT courses tend to promote hand-coding over using modern tools to aid the process. And there is an area where there has to be a balance. You should come away with a reasonable understanding of how the user interface, for example, is put together, but in daily use you would be at a disadvantage if you only knew how to hand-code, and not use an IDE to quickly design the interface. The latter is less about understanding the subject and more about using it in the real world, but it's still important.
You are of course right that vocational courses and certificates should be the most focussed on business-essential skills.
Degree courses do offer more scope for covering underlying theory. Where the degree needs to be business-led is in using reasonably current languages and technologies.
There are very good reasons for learning Java immediately. You can write Java code for your mobile phone, your computer, your Blu-Ray player, for your webserver. While it doesn't teach you pointer arithmetic, there's a very good reason why it is in demand with employers, and that's because it has a use in many places. Another reason it is in demand is that it DOENS'T require pointers - pointers are the ticking time bomb of C programming, because you can introduce fatal memory leaks, security holes and so on by making a mistake using them. Yes, if you need to use them, you need to be able to use them properly, but for most applications a developer could pick a language that doesn't require them.
One of my disagreements with the course was that the 2 languages we studied in the first year were C++ and PROLOG. I didn't mind the C++ as a principle, but it skipped using a modern IDE in favour of hand-coding, insisted on coursework using drawing libraries which weren't readily available for a home PC, and so on. JAVA wasn't an option until the 3rd year, and Visual Basic, etc weren't options at all. In terms of academia, it looked at Systems Analysis And Design, but listed things like the Jackson method as a programming-focussed design method, and skipped it to focus on SSADM. Then, the project wasn't to analyse a computing-related requirement, but to model a business instead. It tried to cover academic fields related to Computer Science, but managed to cover them in a manner that seemed almost actively inapplicable to IT employment requirements.
In my opinion, a Bachelors Degree should aim to provide a student with the skills required for employment in that field. That DOES include academic study, because as you mentioned a sound understanding of the theory is required at times to make accurate decisions. It should also lay the foundation for further academic study in the form of a Masters degree or PhD. In those later qualifications I would expect the focus to be more on academia.
The reason for this is that a Bachelors degree course is generally the first point that a student can fully focus on a chosen subject of study, and potentially the final point where they formally study the subject, so it has to fully prepare them for focussing their future life and
Most teaching adopts the approach that you learn the easy stuff first, and then move onto harder and harder bits. In teaching Java first, and only teaching ones like C++ later, this is taking much the same approach. It seems that the argument is essentially about taking the view that you should learn languages like C++ first to get an understanding of all the lower-level concepts, and to look at libraries later. At uni I studied C++ and Prolog, and Java was reserved for the 3rd year. So I learned a bit about memory allocation and pointers, and now know that I prefer to stay well clear of that - and in fact have been influenced by other academics who suggest that such low-level access to memory is better avoided unless it is necessary. If you need all-out performance, then you may need to do this, but the cost can be obscure crashes, memory leaks, code insecurity, and so on. I also learned about recursion, learning to work with just a single method for iterating through a list. I still use it when it's appropriate (e.g. when parsing trees of data). However, it also taught me a greater appreciation of the value of having more options - for loops, for each especially (again avoiding invalid references). Yes, you can learn to use Java to design a GUI using an IDE, leveraging libraries to achieve most of the 'hard' stuff. And you know what, for most business requirements, this is probably the most productive way to code. Minimal reinventing of the wheel. Maximum leverage of tools to enhance productivity. No, that doesn't give a full appreciation of memory streams, stack vs heap memory issues, hardware I/O, etc. But you're talking about catering for the mainstream. I think the authors are WRONG in saying that a university should be focussed on the academic. The reason people go to university (apart from the social aspects and cheap drink, or dossing around for another few years) is to become more employable, and to earn more. They don't achieve this by learning skills which are in minimal demand in a real world workplace. As a result there should be a balance between the academic aspects and the more employment-friendly ones. Learning to use an IDE and use toolkits also allows the developer to focus on things like the User Interface, something which is often severely overlooked, and relatively incidental to the final design. Rather than criticising teaching a GUI-focussed course, this should be encouraged as part of a complete education, covering essential skills that are often missing from an academic course. I've known a brilliant mathematician and developer who has worked on a number of commercial games, but who took some time to get anywhere because they haven't got the skills in user interface design. Equally, I've know various developers with a shaky grasp of logic and maths, who created a nice GUI and couldn't get the code behind it working right. So yes, there is a place for mathematics and learning the details that require more thinking, because you have to sort the chaff from the wheat. It's a typically academic article - in that it presents the authors particular biases as fact, and one which doesn't necessarily mesh academic utopia with commercial realities sufficiently.