Do you receive the Programmer's Heaven newsletter? If not, why not subscribe?
Theme Graphic
Theme Graphic

The Official Programmer's Heaven Blog

The blog where the Programmer's Heaven team post stuff.

Subscribe

Author

Often knowledgable, sometimes wise, occasionally funny. The Programmer's Heaven blog team post about a whole range of topics, from practical advice on concurrency control to introductions to lesser known concepts such as functional programming. Don't forget to comment on the posts and let them know what you think, like and hate!

Archive

Tags

Posted on Monday, January 14, 2008 at 7:22 AM

What are the next generation of programmers learning?

Recently I read an article asking, where are the software engineers of tomorrow? Written by a President and Vice-President of the company AdaCore, they lament the spread of Java as a first programming language taught on many Computer Science courses and a reduction in the formal and theoretical background that students are being given.

While I can't say I agree with every word they say (for example, they appear somewhat dismissive of dynamic languages), they certainly have a lot of good points. You certainly don't learn to be a good programmer, developer or architect by learning one or two programming languages. To do that you need to understand the whole stack of abstractions form top to bottom, be aware of many programming paradigms and understand (or at least be aware of the existence of) the theory that explains it.

It's important to know what assembly language is and have a rough idea of what the hardware is doing. There's no need to be proficient in the assembly for any one CPU, though seeing the trade-offs between different architectures is useful. Layered on top of that are high level languages like C: they are decidedly high level languages, but they are still pretty close to the metal. I'm not saying that people need to be taught C, but there are some things that people really should understand, especially explicit memory management and pointers. For both assembly and C, people graduating from a computer science course should be able to grab the appropriate reference material and use either of them effectively, because they understand the underlying concepts.

Above this level, we have languages that either sit atop of virtual machines or run with notable runtimes. These languages, free of low-level issues, are good for teaching different paradigms, illustrating algorithms and exploring software engineering issues. No one language should be taught exclusively here. There's a simple reason for this: no one language exemplifies all paradigms and approaches. Programming languages are tools, and they are suited to different jobs.

Java is useful for teaching object oriented programming and reflective programming, and perhaps generic programming too. However, it has nothing to offer with regard to functional and higher order programming, and only shows one approach to typing: static typing with explicit type annotations. If Java's capabilities are all a programmer has even seen on their university course, then they are under-equipped to deal with C# 3.0, which offers both higher order programming and limited type inferencing. Someone who had seen a range of languages and paradigms, however, will be able to C# 3.0 to good effect, rather than writing it like they would write Java and complaining about how anonymous methods and lambda expressions are damaging what was once a "pure object oriented language". (Also, anyone who says that doesn't know what pure object orientation is; neither C# nor Java have ever been pure object oriented languages.)

So far I've just talked about programming, because it's what most computer scientists are recruited to do. However, ideally the ability to program should be a natural fallout of an understanding of computer science and software engineering. That is, programming should not seem that big a deal once you understand the concepts behind hardware architectures, have knowledge of a range of data structures and algorithms and comprehend fundamental issues such as algorithmic complexity (and sorry, but if your computer science course didn't explain at least that, the word "science" deserves no place in the course name). To build real world systems takes an understanding of managing software complexity, safety and security engineering and a range of concepts such as concurrency, databases and so on - all things that should have a place on a computer science course.

If there's any word that could describe a computer science course, it would probably be "holistic". Being equipped to deal with the challenges the computing field faces requires a wide skill set, encompassing mathematics, electronics, engineering, psychology and more. And it involves taking the word "science" seriously and teaching concepts, rather than bringing up a bunch of code monkeys who are ill equipped to deal with what lies ten years down the line, because it's not Java or PHP.
Bookmark: Submit To Digg Submit To reddit Submit To del.icio.us Bookmark With StumbleUpon Bookmark With FaceBook Bookmark With Google Bookmarks   Share: Share By Email By Email

17 comments on "What are the next generation of programmers learning?"
Posted by etki on Monday, January 14, 2008 at 8:44 AM
Image Of Author
Read the Article
I read Dr. Dewar's article that is referenced above it was written in the USAF Software Engineering Journal CrossTalk. I believe in the holistic approach: courses in assembly language programming, C, C++, even Ada (which is overlooked in the industry). If a software engineer is worth his salt, he will be able to be competent and proficient in all these languages in addition to Java. I also recommend Perl and especially Python. Leave your egos at the front door when you come to work, be openminded, and don't try to put square pegs in round holes because of your personal preferences and fear of learning a new skill. Kind regards,
Posted by Kristiono Setyadi on Tuesday, January 15, 2008 at 12:25 AM
Image Of Author
Next Generation of Programming Language
The C is common. From the ancient 'til now and I think it still exist and dominate the operating system architecture in the future. Assembly don't take the place so high because of its complexity and time-consumed language (but it still powerful in addition to another language because of its capability to talk to the machine). Java and PHP are popular and become superstar nowadays.
Posted by Sephiroth on Tuesday, January 15, 2008 at 6:48 PM
Image Of Author
College Institutions Are At Fault
Being a long-time programmer myself, I totally agree with this. Enough with the crappy languages! We need C and C++ in our colleges. I am currently in an IS course for a two-year degree and the ONLY thing relating to programming I have had is VisualBasic.NET and PHP5! I have been doing Basic since the Atari and Commodore days and while it is a good introductory language, it isn't C or C++. Every college course should have at LEAST C and preferably C++ since it works on all platforms, unlike VB.

The instructor is now being pressured to do away with VB and teach Perl and possibly Python, which won't get you far unless you're a big-time Linux geek (I am a Linux geek myself, don't take that as being offensive). The colleges have moved from C/C++ down to VB and apparently Perl/Python is next. How can anybody write a game as complex as Unreal Tournament 3, or a program as feature-rich as the office suite if they don't know a decent language? Without cross-platform, true OO languages like C, C++, or Pascal, the next generation of programmers won't get very far.
Posted by Roger on Wednesday, January 16, 2008 at 6:21 AM
Image Of Author
How about Ruby
You forgot to mention it. It's quite impressive.
Posted by Kieron on Wednesday, January 16, 2008 at 8:56 AM
Image Of Author
Some good points, but
I disagree with a lot of that (though not all). I think you should just make sure you teach the major different language styles. Principly this is a strongly typed OO-imperative language (e.g. Java), a parallel CSP-like language (e.g. Occam), a pure-functional language (Haskell) and an assembly language (MIPS/M68K). Perhaps also a 4th generation language such as prolog or SQL. Anything else is just sugar. The aim is to teach how to think most of all.
Posted by pheaven on Wednesday, January 16, 2008 at 1:59 PM
Image Of Author
Thanks for the feedback!
Hi,

It's been interesting to read everyone's comments - thanks for leaving them. I'll try to respond to a few.

Etki - very, very much agree with the "tool for the job" approach, rather than getting stuck with what's familiar. This is why it's essential that people have skills to learn new languages and tools quickly and easily because the understand the underlying concepts.

Kristiono Setyadi - yup, I don't see C going away anytime soon either. Love it or hate it, we'll be hacking in it for some while yet for systems stuff, so industry is going to really need people who understand it. Working on a large open source C project, I certainly know how tricky finding C programmers today can be.

Sephiroth - just because a language isn't C or C++ doesn't make it crappy. Really interesting to hear from someone who is currently taking a course, though, and to hear your frustrations. I guess VB.NET is OKish for showing OOP. PHP is, well, it's a good example of why most other languages have namespaces, I guess. Seriously, though, I think that it's good to teach one dynamic language on a course at least, such as PHP, Perl, Python or Ruby. I just can't imagine doing two of them exclusively though (Perl and Python). Ouch. Two languages really isn't enough to capture a wide range of concepts.

Roger - Ruby is a good example of a dynamic language, and I'd be happy enough to see it taught as that - so long as a range of other, different languages were covered too.

Kieron - not sure if you were disagreeing with the article or what I wrote! Teaching the various paradigms rather than just one and equipping people to be able to think for themselves is kinda what I was trying to argue. As for everything else being sugar, I think it's critical that people learn about theory as well as issues, such as security, that cross-cut languages though.

Thanks for reading!

Jonathan
Posted by dcouchotvore on Wednesday, January 16, 2008 at 2:35 PM
Image Of Author
Crucial: Assembly Language
I have to put my two cents in about this, having spent most of my career working with people who have never even seen assembly language programming. They don't know what a register is, how a stack works, what I/O really is, or even where a CPU fits into the picture, other than that it's a chip on a motherboard these days. In short, they don't know how a computer works. I find that shocking. It's a bit of a feather in my cap to be the only one that can fix low-level problems, but hiring a programmer that doesn't know how a computer works is rather like hiring a mechanic that doesn't know how an engine works. When I started programming, this was all a required part of college courses. What has happened since then?
Posted by Pierced1 on Wednesday, January 16, 2008 at 6:01 PM
Image Of Author
suggestions on languages to learn?
I'm currently studying computer and system science in Sweden.

At first we learned how to use VB.Net (easy enough for simple tasks it seemed) After that we moved on to databases (MS Access > MySQL) Third came Prolog witch was really a pain in the a** and now last JAVA.

well this is basicaly the languages we are supposed to learn, sadly enough the JAVA course sucked so a loth of ppl didn't finish it and now i'm straggling with some tutorials i found online. found some here that teached me more on 1h then the course managed in the first weeks... (except for the thery behind it all.)

I'm thinking on digging depper into MySQL after i learned JAVA and wonders about tips that will help me advance further? jobwise...
Posted by pheaven on Thursday, January 17, 2008 at 10:00 AM
Image Of Author
Assembly, and some tips
dcouchotvore - nice real world example of the problem. Well, not so nice, but you know what I mean... I was lucky enough to be on a course that covered this stuff well, but it seems there are plenty that don't, if you're the only one who can deal with such issues. A talk I'm giving a lot at conferences at the moment is about writing parallel programs that have a chance of performing decently. I expected that a common complaint would be that everyone already knew about cache coherency issues and how they mattered a lot when writing multi-threaded code, but I've not had one person say it was too basic yet. So I guess that maybe it is new to many people. Understanding how to write decently performing parallel software with primitives such as threads and locks falls pretty directly out of this lower level understanding...

Pierced1: Prolog is the only language I know where it took me 5 minutes to figure out how to write a program to compute whether somebody was my cousin, but took somewhat longer to implement factorial in. Of course, that's not what it's for. 4GL languages tend to be domain specific. SQL is a 4GL, by the way, just like Prolog. I had a sucky Java course too, so I can empathize with that.

As for what you should learn. Good news is if you understood VB.NET well, then C#.NET should be easy enough for you to dig into; you already know the .Net class library stuff. I'd encourage you to learn about higher order programming for a taste of something different. Maybe check out my post on ML. Not because you'll probably need to know ML, but because it'll open your mind to that paradigm, and you can apply it in other languages. C# 3.0 is good for higher order programming. I'm doing lots of that these days.

Read up on concurrency. Read up on security. Learn about some common data structures (stacks, queues, hash tables, lists, trees) if you haven't already, and most of all understand the algorithmic complexity of various operations on them, as then you'll be able to match them to real world problems. Then learn some algorithms too (e.g. for sorting, searching and so on), and again their trade-offs.

As dcouchotvore pointed out, low-level knowledge is important. Do some reading on that kinda stuff too. I suggest learning a bit of C (though C's a tiny language so there's only really a bit of it to learn...the libraries will take a lifetime, though). But seriously, if you grasp pointers and function pointers FOR REAL that's a very good thing. And if you can get the compiler to spit out assembly too and follow what is going on there, that's good too.

As I said, being a good developer involves knowing a lot of things. You won't learn that overnight, and you shouldn't expect to stop learning some day either. I'm still learning plenty all of the time, so I can keep up with the latest tools and techniques.

Finally on job stuff, knowing what automated testing is (I just blogged about that in this very blog) and version control is and having played a bit with both of them will be helpful - they are used by pretty much all good development teams.
Posted by Ed Coyne on Thursday, January 17, 2008 at 1:26 PM
Image Of Author
Current student
I am currently finishing up my CS degree at UCF. I am sorry to hear about the shitty state of affairs in some CS programs, ours is rather complete. While language wise we mostly do java and c/c++ (with a small introduction to lisp) our program mostly focuses on the underlying principals.

For example our programming languages course mostly focused on the concepts from which programming languages developed: stack/heap management, register management, dynamic/static linking, etc.. instead of being a class of "ruby is better than php because... blahblahblh" (I read enough of that shit online). Our OS class doesn't go into the different OSs so much as it covers the basics of operating systems process scheduling, interrupt handleing, virutalizing resources (memory, printer, etc..), multiprocessing. With general CS courses covering all the generic CS topics such as basic structures and examples on how to implement them. The real upshot of all of this is that it is a worthwhile degree. If your degree is really in "how to program in c++" what are you going to do in 15 years when c++ is the new fortran. The degree was a waste.

Aside from going to school I have also been working professionaly for about 4 years now (since before I came here). Most of this is in the web feild but from that I have learned several languages and I feel that teaching multiple languages in a CS program is pointless. Once you understand the concepts than picking up a new language is a fairly arbitrary task. Besides computer science isnt about programming, programming is mearely a tool. This is one thing that many people seem to miss in all the language battles that go on. Simply find the right tool for the job and use it. No matter how good the language you can create crap in it, and no matter how shitty the language you can most likely create a nicely coded app in it.
Posted by Sephiroth on Thursday, January 17, 2008 at 8:43 PM
Image Of Author
Too much .NET...
C#.Net is still .NET, which makes it Windows proprietary. My references to C/C++ were only because I use them and love them, there are plenty of others out there as well. The thing is, our schools are now teaching more and more .NET languages, which won't get you anywhere on any platform outside of Windows. For the big industries, they may need an application that works under Unix/Linux, Mac, and Windows, not just Windows.

My other big quarrel with .NET, or at least VB.NET, is that while it can demonstrate a very basic understanding of classes, methods, inheritance, and everything else, it stops there. You never use a "main" loop in VB.NET or anything. I imagine C# is similar, but do not have experience with it. In VB.NET, you simply write up your classes and tell the IDE which class is your startup class, and it handles the main loop and everything else. This inhibits a lot of common practices which require more access, such as in a main loop to time things. This is fine however, for a basic Windows application such as a word processor or email client.

Dcouchotvore, I like your opinion. I started in Basic on an Atari400 with a cassette drive and when I learned ASM on the 6502 chips I was in heaven. While I know MUCH less on x86, I do wish somebody taught it nearby. The more ASM you know, the more valuable you are, and the faster you can make an app go. Think of what UT3 or Oblivion would be like in terms of speed, if they were entirely ASM instead of C/C++!

Again, not being biased to C/C++, but it is what is used on a majority of games out there, and my goal is to program game engines and physics engines. Pascal could also be used, and has been in the past, but I don't think that it is as popular as C or C++. I also got a sheet with the highest paying jobs in the industry, and the two highest are project managers and C++ coders, with the coders coming in at about a hundred bucks more annually. That said, Basic (all forms, VB.NET, PowerBasic, etc) is probably the most widely used language due to its simplicity and ease of use, and I do agree with colleges using it to introduce people to programming, but they shouldn't make it out to be the best and only thing one should use, like they currently are.
Posted by Actor on Monday, January 21, 2008 at 12:09 PM
Image Of Author
The Marketplace
For better or worse the marketplace is what drives everything. Universities need to attract customers (i.e., students) and if CS seems too complex they will opt for other majors. Industry wants well trained engineers/programmers. The two goals are at odds. The majority of students are consumers of CS products, not innovators. Those who Those who have the intellectual ability, curiosity and drive to excel are in the minority and are not enough to meet demand.

This is nothing new. Those who excel have always been in the minority. It's a supply and demand situation.

The truth is that the kind of graduates that the authors want are out there. All they have to do is take out a full page ad in the Wall Street Journal listing all the qualifications and offering a starting salary of $1,000,000 per year. They will get more resumes than they can handle.

But industry does not want to do that. Instead they want academia to produce more of what they need so the demand can be met while paying lower salaries. It's not going to happen. Academia simply does not have the raw materials.

Industry does not like it but to get what they want/need two things need to be in place: (1)in house on-the-job training and (2)high enough salaries to attract the best graduates away from the competition.

On-the-job training has to be part of the equation because a student pretty much need to have his course work planned out by the end of his sophomore year, if not earlier. At the pace that the industry advances today that is too early to anticipate what industry will want the day he graduates. The best he can do is a broad background to enable him to adapt to whatever he is faced with when he starts working.
Posted by Actor on Monday, January 21, 2008 at 12:28 PM
Image Of Author
Java and C++ most in demand
According to the US Dept of Labor, Java and C++ are the languages most in demand. Why shouldn't a student and a University offer these languages first?

http://www.bls.gov/oco/ocos110.htm#training
Posted by Sephiroth on Friday, January 25, 2008 at 11:23 AM
Image Of Author
In demand due to lack of training
You're right, and C++ coders generally get around $100k a year. I believe that part of the problem is that teachers don't know how to do C++ and thus cannot teach others how to do it. Not only that, but due to lack of training now, how are others to teach it to future generations? I have been doing C++ for years, but I have had a hard road learning it on my own as people like AsmGuru here at PH can tell you. I'd kill for some advanced, formal training in it.
Posted by http://vredit.wikido on Monday, May 12, 2008 at 4:24 PM
Image Of Author
http://vredit.wikidot.com/free-credit-report
http://vredit.wikidot.com/free-credit-report http://vredit.wikidot.com/free-annual-credit-report http://vredit.wikidot.com/free-credit-report-com http://vredit.wikidot.com/free-online-credit-report http://vredit.wikidot.com/my-free-credit-report http://vredit.wikidot.com/free-credit-report-on-line http://vredit.wikidot.com/free-credit-report-and-score http://vredit.wikidot.com/free-credit-report-government http://vredit.wikidot.com/free-credit-score-report http://vredit.wikidot.com/free-anual-credit-report http://vredit.wikidot.com/get-a-free-credit-report http://vredit.wikidot.com/www-free-credit-report-com http://vredit.wikidot.com/get-free-credit-report http://vredit.wikidot.com/free-yearly-credit-report http://vredit.wikidot.com/free-credit-reports http://vredit.wikidot.com/credit-report-for-free http://vredit.wikidot.com/experian-free-credit-report http://vredit.wikidot.com/free-annual-credit-report-com http://vredit.wikidot.com/free-credit-report-no-credit-card http://vredit.wikidot.com/free-credit-report-gov http://vredit.wikidot.com/free-copy-of-credit-report http://vredit.wikidot.com/free-instant-credit-report http://vredit.wikidot.com/free-credit-report-no-credit-card-required http://vredit.wikidot.com/totally-free-credit-report http://vredit.wikidot.com/free-annual-credit-reports http://vredit.wikidot.com/free-credit-reports-online http://vredit.wikidot.com/how-to-get-a-free-credit-report http://vredit.wikidot.com/my-free-credit-report-com http://vredit.wikidot.com/your-free-credit-report
Posted by sdf on Sunday, May 18, 2008 at 11:17 PM
Image Of Author
sadf
http://mortage.wikidot.com/mortgage-calculator http://mortage.wikidot.com/flash-mortgage-calculator http://mortage.wikidot.com/mortgage-calculator-plus http://mortage.wikidot.com/complete-mortgage-calculator http://mortage.wikidot.com/mortgage-calculator-com http://mortage.wikidot.com/www-mortgage-calculator http://mortage.wikidot.com/mortgage-calculator-for-website http://mortage.wikidot.com/mortgage-calculator-software http://mortage.wikidot.com/free-mortgage-calculator http://mortage.wikidot.com/c-mortgage-calculator http://mortage.wikidot.com/business-mortgage-calculator http://mortage.wikidot.com/mortgage-calculator-download http://mortage.wikidot.com/mortgage-calculators http://mortage.wikidot.com/free-mortgage-calculators http://mortage.wikidot.com/aol-mortgage-calculator http://mortage.wikidot.com/quick-mortgage-calculator http://mortage.wikidot.com/calc-mortgage http://mortage.wikidot.com/mortgage-calculator-html http://mortage.wikidot.com/calculate-your-mortgage http://mortage.wikidot.com/financial-mortgage-calculator http://mortage.wikidot.com/mortgage-calculator-new-york http://mortage.wikidot.com/easy-mortgage-calculator http://mortage.wikidot.com/mortgage-rates-calculator http://mortage.wikidot.com/calculator-for-mortgage http://mortage.wikidot.com/detailed-mortgage-calculator http://mortage.wikidot.com/canadian-mortgage-calculator http://mortage.wikidot.com/mortgage-finance-calculator http://mortage.wikidot.com/california-mortgage-calculator http://mortage.wikidot.com/mortgage-calculator-table http://mortage.wikidot.com/bi-weekly-mortgage-calculators

http://allrecipes.wikidot.com/recipe http://allrecipes.wikidot.com/chicken-recipe http://allrecipes.wikidot.com/salmon-recipe http://allrecipes.wikidot.com/recipes http://allrecipes.wikidot.com/chicken-recipes http://allrecipes.wikidot.com/all-recipes http://allrecipes.wikidot.com/cake-recipes http://allrecipes.wikidot.com/cheesecake-recipe http://allrecipes.wikidot.com/cookie-recipe http://allrecipes.wikidot.com/cake-recipe http://allrecipes.wikidot.com/smoothie-recipe http://allrecipes.wikidot.com/salad-recipes http://allrecipes.wikidot.com/food-recipes http://allrecipes.wikidot.com/drink-recipes http://allrecipes.wikidot.com/recipes-com http://allrecipes.wikidot.com/a-recipe http://allrecipes.wikidot.com/food-recipe http://allrecipes.wikidot.com/cookie-recipes http://allrecipes.wikidot.com/dessert-recipes http://allrecipes.wikidot.com/salsa-recipe http://allrecipes.wikidot.com/healthy-recipes http://allrecipes.wikidot.com/easy-recipes http://allrecipes.wikidot.com/pancake-recipe http://allrecipes.wikidot.com/cocktail-recipe http://allrecipes.wikidot.com/soup-recipes http://allrecipes.wikidot.com/salmon-recipes http://allrecipes.wikidot.com/chili-recipe http://allrecipes.wikidot.com/crock-pot-recipes http://allrecipes.wikidot.com/dinner-recipes http://allrecipes.wikidot.com/bread-recipes

Leave A Comment
Subject:


Comment:
   Bold Italic Underline          Code Link Image Horizontal Rule


Because you do not have or are not logged in to your Programmer's Heaven account, please enter your name.

Name:


To help prevent comment SPAM, please enter the magic code '524' in the box:




Posting Rules
Please follow these rules when posting comments on blog posts.
  • Do not post anything that is racist, hate speech or of a sexual or adult nature.
  • Do not post or link to anything that infringes copyrighted laws.
  • Posting about security or legal topics is fine so long as you are not glorifying or encouraging people to perform illegal activities.
  • Both the author of this blog and the Programmer's Heaven administrators may delete any inappropriate comments without notice at their own discretion.
 
Popular resources and forums for programmers on Programmersheaven.com
Assembly, Basic, C, C#, C++, Delphi, Java, JavaScript, Pascal, Perl, PHP, Python, Ruby, Visual Basic
© Copyright 2009 Programmersheaven.com - All rights reserved.
Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
Publisher: Lars Hagelin. Read the latest words from the publisher here.
Be the first to sign up for Lars Hagelin’s In-depth Outsourcing Newsletter here.
bootstrapLabs Logo A bootstrapLabs project.