Bjarne Stroustrup On Educating Software Developers
jammag writes "Bjarne Stroustrup, creator of C++ and a professor at Texas A&M, weighs in on the problems in today's CS programs. In particular, Java (there's too much of it), the quality of graduates (companies aren't happy), and the need to balance the theoretical and the practical (long overdue). Not pulling punches, Stroustrup even talks about high schools — 'High schools could teach students to work hard at something (just about anything), to search out information as needed, and learn to express their ideas in writing and orally.' He finishes by giving advice to working developers: 'Serious programming is a team sport, brush up on your social skills. The sloppy fat geek computer genius semi-buried in a pile of pizza boxes and cola cans is a mythical creature, best buried deep, never to be seen again.'" Read on for more choice quotes from the quotable professor.
I have even had questions from strangers in airplanes: "You're a professor? In software? Have you got any students? Here's my card."
The US industry could absorb more good developers than there are currently students enrolled in IT-related programs — but not all of those programs and all of those students would qualify as "good" in this context.
The companies are complaining because they are hurting. They can't produce quality products as cheaply, as reliably, and as quickly as they would like. They correctly see a shortage of good developers as a part of the problem. What they generally don't see is that inserting a good developer into a culture designed to constrain semi-skilled programmers from doing harm is pointless because the rules/culture will constrain the new developer from doing anything significantly new and better.
The contemporary Math, Physics, and Biology books I have seen are far, far more conceptually challenging than what we present to CS and engineering students in the area of programming.
I think the ultimate aim is to make programming more of an engineering discipline, more mathematical or scientific; "craft" and "art" are both needed, but there ought to be a scientifically based core on which people can base their craft and art. Software design and implementation is more than a craft; there is more math, science, and engineering to know and apply than is customary for fields we call "crafts." Incidentally, I find it appalling that you can become a programmer with less training than it takes to become a plumber.
I have even had questions from strangers in airplanes: "You're a professor? In software? Have you got any students? Here's my card."
The US industry could absorb more good developers than there are currently students enrolled in IT-related programs — but not all of those programs and all of those students would qualify as "good" in this context.
The companies are complaining because they are hurting. They can't produce quality products as cheaply, as reliably, and as quickly as they would like. They correctly see a shortage of good developers as a part of the problem. What they generally don't see is that inserting a good developer into a culture designed to constrain semi-skilled programmers from doing harm is pointless because the rules/culture will constrain the new developer from doing anything significantly new and better.
The contemporary Math, Physics, and Biology books I have seen are far, far more conceptually challenging than what we present to CS and engineering students in the area of programming.
I think the ultimate aim is to make programming more of an engineering discipline, more mathematical or scientific; "craft" and "art" are both needed, but there ought to be a scientifically based core on which people can base their craft and art. Software design and implementation is more than a craft; there is more math, science, and engineering to know and apply than is customary for fields we call "crafts." Incidentally, I find it appalling that you can become a programmer with less training than it takes to become a plumber.
This is all well and good, and there's no doubt that an engineering/logical approach is very important in programming, but there is something of an art about development as well. I can slog all day coding away, working from diagrams, notes and even flowcharts (though not formalized ones, I'll admit, like days gone by), but sometimes my best and most productive work are those creative flashes I get, when any kind of formal process is tossed out the door. Sure, I have to go back later and comment the code so that even I can understand it, but there will always be that creative aspect to programming, and that ain't necessarily bad.
The world's burning. Moped Jesus spotted on I50. Details at 11.
... the man is dreaming IMHO. If you look at modern computer languages, hardware design, and operating systems, NO ONE is doing good engineering. It took forever (a decade or more at least) to handle crashes in a microsoft OS which had thousands of talented people working on it. The companies that complain about the lack of "good" developers are the ones paying their developers crap and looking to offshore/cut costs. If you want good developers you're going to have to pay them.
The modern commercial environment for developers is not conducive to fostering great teams, since the all mighty buck reigns and stupid decisions are made.
From an engineering standpoint: There is no reason for software to break, and yet it does, a lot of the time. To use a familiar example: We see this all the time with video games on the PC, hardware requirements, etc, etc.
And if we had been creating software for as long as we've been building buildings, we'd probably be better at software as well.
I do think we need to get better at educating, but I still think we're in the "Learning how to make practical software WELL" phase of the discipline.
I know about extreme programming, and I've really enjoyed some team programming sessions, but when it comes down to it, I think one reason some people hold a much deeper level of knowledge than their peers is that they spend extreme amounts of time alone.
Some people:
--get really good at coding
--get really good at math
--get really good at video games
--read large numbers of books
and finally some people watch a lot of television
The people who read a lot of books sometimes gain a better understanding of other people, the people who watch a lot of TV have an increased repertoire of small talk, and in today's world, video games are increasingly a team sport. All of those things facilitate increased human contact.
People who are fascinated with math and coding tend to have fewer peers who can understand what they are doing. Is this a bad thing? I don't think so. Maybe I grew up as more of an introvert in some regards, but in other ways I'm socially adjusted. I guess the challenge is to guide young people to seek out their peers (those who are fascinated with the same things), and to make friends without making everything into a competition. It's hard for young nerdlings to recognize a peer intellect without wanting to prove themselves better. There is a place for ambition, but that instinct can be a hinderance.
My two cents,
-t.
Yet while Stroustrop agrees that Java has been used to dumb down CS programs, ultimately, âoethe problem is one of attitude, more than an issue of programming language.â
He is not dumb enough to claim C++ superior to Java. After all it is an C++ is so aweful "designed" that if you are not completely sunk in C++-think, you spend more time fighting the language and its warts than actually do useful stuff (like thinking about algorithms and what the machine does like Don Knuth taught us). While Java is very high level it at least got rid of some of the ugliest and worst mistakes that C++ made. Everyone is way better off with C (for systems stuff), Java (for "enterprisy" stuff), Python (for frontends) and sh (for quick and dirty hacks) than with any C++(*).
/End Rant
http://yosefk.com/c++fqa/
(*) And dont tell me its because of the age of C++. Objective-C and Lisp are way older and way better designed than C++ for example.
Most of these topics can easily be researched and learned without a university.
It isn't like say, brain surgery or nuclear engineering.
Mod me down, my New Earth Global Warmingist friends!
The article starts off by claiming Stroustrup created C++. Fair enough, but then, in the same paragraph, the author claims that C++ is used in "google search" and the iphone. Doesn't the iphone platform stress objective-C ( like all current Apple platforms )? Objective-C != C++. It could be a minor thing since I dont do either, I am just saying something, maybe. Maybe like he does not know his subject matter, or assumes his readers do not.
The rest of the article was mostly about the Stroustrup history, not what he said in the presentation. Its almost like the author cherry picked a few damning things his subject said in a presentation totaling ~42 words and then gave it a provocative title, and a bunch of interpretation.
Like I give a shit what the author thinks.
NOTE: I would apologize for the way my brain works but I am held captive by it. Its not my fault. I think.
I think you underestimate just how much I just dont care.
I was a developer. Highly paid and with lots of stock options. I worked my ass off for years and years making double the average salary. I was on a plane to Japan more than a few times with less than 24 hours notice. "Employee of the year."
I got tired of it and switched into systems design - technical architecture. My salary went down a little, but my work load became manageable again - 50 hours per week.
I miss programming. It was enjoyable and gave me a feeling of accomplishment - every day. I'd return, but the salaries are half what I'm worth (IMHO). I'll stay in technical architecture for the higher salary, greater prestige and control and continue my work on outsourcing development where ever it is most efficient (generally, not India).
Bad programmers are why companies don't take a chance on good programmers. Many good programmers can't get a job because the HR department thinks you actually need experience in a specific set of software in order to be good at the job. Good programmers know they can pick up most any language and get cracking within a week or so. For me its:"Yeah I've coded since I've been able to type so over 10 years of basic followed by over 10 years of C/C++. A Carnegie Mellon degree in Scientific Computing. No experience, but I have coded several large projects at home." I applied to thousands of jobs on job boards, and I never cracked into the industry.
God spoke to me.
Having taken a class from him, I cannot honestly respect any feelings he has about education. The man is hands down the worst professors I have ever had, He has no concept of teaching, he rather just rambles in class and expects the students to know everything. In a intro level CS class, he expected every student to be proficient in C++, event though in Texas, the high school CS curriculum is entirely JAVA (which isnt a good thing, but it is the way it is). While I agree with what he says, I do not support him even talking about education. If he were not the creator of C++ he would not have a job in Acedamia.
Funding is a necessary but not a sufficient condition for academic success. I attended a school district that spends about half as much per pupil than the big city school district despite having about 3x more special needs kids per 1000. Despite that lower funding level they achieve a 90+% college attendance rate vs about 20% for the large school district. The difference is that in the district I attended (and the similar one my children now attend) the parents expect their children to succeed and put a great deal of effort into making sure that happens.
There are 4 boxes to use in the defense of liberty: soap, ballot, jury, ammo. Use in that order. Starting now.
Well I would even go beyond that to say that schools should teach basic logic and abstraction of concepts; good development requires the developers to be able to abstract well and I see alot of programmers who still think very linearly.
This is my sig. There are many like it but this one is mine.
There is more java about than c++ because it is easier to teach.
System development and construction are not similar disciplines.
Programming and Plumbing are similar in that they both start with P.
You seldom know the true reasons people don't take jobs. I am offended at being lowballed, but think it is a good indication you don't want to work there anyways. Smile, nod, and politely turn them down when they make a formal offer. It may be a Canadian thing....
Do you interview people at all? I'm a programmer, and I do. (We do mostly technical interviews.) There are people coming out of colleges with masters degrees that can't write a stack. In Java. Using anything but java.util.Stack. Who screw up, badly, a simple array-reversal coding question. I know my company pays very well. We are lenient on experience and knowing all the latest whizz-bang technologies if someone can show they can think and solve problems and possess some basic skills. The vast majority fail at this, hard.
If colleges did their job and taught students business skills such as economics, accounting, project planning as well as professional programming skills such as object oriented programming, secure coding, MVC, three tier system design and SQL, and not calculus IV obscure algorithms, zxy-tree discrete unified field algorithm garbage we would not have this problem.
HR is convinced computer science is required for any I.T. job when in fact they do not teach practical skills outside of academia. The .com bust created a large surplus of candidates where they could require it but now its leveling out and they are filtering good applicants out.
Every other profession out there is trained at a university on how to do their job. HR is trained from a B.A. with a minor in H.R. Chemists are trained with a science degree in chemistry, teachers with a teaching degree, etc. Its logical to assume HR thinks computer science teaches students how to be practical in business.
http://saveie6.com/
The big problem with most Computer Science bachelors' programs out there is that they make sure students are well equipped to deal with the hot language of the times (often n-1 due to the slowness of curriculum design). This is currently Java. This ensures graduates can go and get jobs in the industry and make money. However, when that language dies out and is replaced by whatever is next (often C#, Ruby, JavaScript, or even C/C++ with GTK+ or Qt), the graduates don't know how to adapt. Why? They were taught everything they know in just one language, and the lessons were too entrenched in the specifics of that language. They weren't taught to learn, they were taught to code. This separates the good CS degrees from the bad ones.
Until recently, MIT used a simplified version of scheme to teach its introduction course. The advantage to scheme was that it was mostly academic, and it was simple enough for the students to not get stuck on language-dependent structures (in fact, the course uses its own sub-language to further simplify things), plus it is VERY different from C/Java-style languages (scheme and lisp use prefix notation whereas C and Java use some informal mix of infix and prefix with ambiguous grouping rules). After that, it was on to Java.
I hear they use python in that course nowadays. Not just python like scripters and web developers use it, but python because it is a simple and easily learned language for the purpose of teaching specific concepts. In fact, the curriculum of that introductory class leans heavily on electrical engineering principles; An article of The Tech from 2006 describes the new entry-level course as "designed to teach freshmen introductory electrical engineering and computer science in an integrated fashion using mobile robots as a case study."
This pushes the idea of teaching the concepts rather than the language. A well-trained software engineer should be able to pick up a new language in short time, since all the abstract models are known quantities. The hurdles should be in learning or un-learning scrum, agile, and MVC rather than J2EE, Lua, and Qt.
Proper instruction must be modeled after teaching flexibility and raw logic. Entry-level courses should include basic theory of computation (automata) and should focus heavily on discrete math and logic. Middle-level courses should include statistics, probability, object-oriented design, and should additionally build on the entry-level courses. Advanced level courses should include collaborative design and over-arching design principles like MVC and agile development. At least two different languages should be required by various courses, and the math courses should not use any industry-usable language at all (NFA is a language after all...). Companies tend to vastly prefer CS-Math dual-majors over other degrees because it shows you understand the data structures and algorithms; such a program can't just teach you a programming language and call it a degree.
Use my userscript to add story images to Slashdot. There's no going back.
Not sure if this helps or hurts, but here is why I mainly only hire developers with degrees: it shows dedication. It might not be the best practice, but being able to "stick it out" shows me that you have the tenacity to stay with a problem and find ways around your shortcomings to succeed because many times, a project throws you in situations where your education will let you down, but you still need to succeed.
Please note that I said "mainly" because I do realize that there people that do not fit in the normal mold, but they are found very quickly usually through references from friends/family in the field.
Agreed. Every student in CS probably knows 'a thing or 2' about computers and will try to multitask. Again and again it has been proven that multitasking actually does not work nearly as well 'single tasking'. The computer multitasks, not the user! So you cannot open up your word processor/text editor, type a paragraph, go on Facebook, (stupid people) check your sports statistics/(smart people) check important news, your downloads on whatever client, and rinse and repeat. For many, this is normal behaviour. And it does not apply to just CS students really. It applies to just about anyone with a PC these days. Older people often do not even know the computer can do more than one thing at once, so they stay focused one thing at a time. Not bad I guess.
I would love to see a school implement what you are saying. Old computers, no Internet, a foreign but learnable *nix (BSD or Linux with no X until necessary!). And students not allowed to bring their own computers. Then CS can really focus and will learn how to use *nix (not X or any GUI), a good text editor (Vim or Emacs; Nano for quick edits), and everything else necessary without even using a mouse. In fact, take away the mouse completely! Minimalise!
At my university the normal thing for 1st/2nd year CS students is to go to the "Linux Lab" (old crappy Red Hat with GCC 3.4.x and GNOME), open up an X terminal and ssh (because the server runs x86 and the machines are running x86-64 mode). They could forgo the entire X portion (speed things up too), and use x86 mode.
I am not sure why every time I go to any lab I find things not set up the way I would like to see. And I do not think I am the only one, nor am I complaining because I am not root. GCC 3.4.x and all the other old versions of software in that RHEL distro is a joke in my opinion. An insult.
I agree with you. However, there are also several issues that I think need to be addressed.
1. Training. My bother left engineering and went into law. He found it 1000x more professional. For one thing, as he joined, he was assigned a mentor and received proper training. Contrast this to many software companies where managers/other developers actually think 'throw them in the fire' is the best way to train. He's in patent law by the way... making about 3x more than the people doing the inventing :P It's genius actually. In this sense, the suggestion of apprenticeship is a great one.
2. Quality of People. I don't think the top kids in a high school graduating class are going into computer science/engineering anymore. They have learned it is not a good field to be in. At the end, you're most likely going to end up a regular job that pays above average. With the kind of talent it takes to be a good software developer, you're much better doing something else (Doctor, nurse, CA, lawyer...) So naturally the grads are not going to be 'as good.'
3. No professional organization. This is a huge one. To the outside world, no one knows what a good software developer does. Just as most of us know nothing of what makes a good lawyer. We treat lawyers like a black box. Here's what I need done... now go. This is how businesses treat software. It is professional organizations that mantain the quality of people. They take care of ensuring people are trained properly and things work as follows. You don't need to know anything about accounting. However, if you're a business and need some complex accounting done, you get a CA not just some guy with a few accounting degrees. It is also why most professional organizations employ themselves. CAs join firms like PWC, KPMG... Lawyers do their own thing. Software developers work for a business. Which yes... makes you just another worker bee.
But anywhose. I don't the situation improving much in North America at least. Worst of all, all the new investment in new grads is being done in India/China. So it's not like young people in Western Companies are getting the grooming they need. It's a viscious cycle that is only going to make it worse.
My high school didn't even remotely prepare me for university-level education. I literally skimmed through high school (that is, minimal effort) and (based on my standardized test scores) I got a scholarship for my first year of university. Then I tried to skim through my first year of university. Needless to say, it didn't work - I had to retake three classes.
It wasn't a lack of funding in high school that caused the problem. It was because schools in the U.S. aim to teach the slowest student in the class - even in advanced placement classes. (Yes, I realize I'm arrogantly claiming I'm smarter than the rest of my class. Humor me.) The whole "no child left behind" idea is fundamentally flawed - if they teach at the slowest student's rate, then the smartest students are going to be extremely bored, and they're going to turn their attention to unimportant things like video games.
If high school had required me to actually exert effort to graduate, I would have been far better prepared for a university-level education.
It apppalls me that Strouestrup is appalled that people can work as programmers without having had his University's darn supposedly valuable training. Whatever happened to the time-honoured tradition of a bright kid teaching themself assembler and networking and graphics in their bedroom? How many legendary micro programmers would have made their mark if they were forced to go through that lousy academic education process and pass their lousy applied-math exams (because that's what "computer science" is)? I never did like C++, I always thought the extra baggage just got in the way. I hereby accuse Strouestrup of foisting the whole O-O mess onto the C world. At a stroke thousands of top-notch C programmers were told they were 'out of date' by the HR department who wanted to replace them with the new cheap C++ grads. Then the C++ guys had it done to them when Java came along, then the Java guys with things like Ruby, PHP etc. As soon as I heard C++ acolytes talking breathlessly about "polymorphism" and "abstract base classes" I detected a strong smell of horse-shit. And look what a gargantuan mess they've made of C++ now! This is literally the language you will never stop learning. We are so lucky that C itself has remained largely uncontaminated by this disaster and we must fight to prevent any of that crap being transferred from C++ back into C. And as for industry: they are interested in just one thing; getting it done on the cheap, and paying people as little as possible, wherever they can find them in the world. Fuck 'em. So Bjarne Strouestrup, it's clear to me that you're well and truly serving your new masters at Texas A&M who are doubtless stuffing your fat arse with wonga. If you're so hot, why don't you go write some damn software in that crappy language of yours and show us what you can do? Don Knuth wrote Tex (major respect due); Larry wrote Perl and Patch; the awesome RMS wrote GCC, GDB, EMACS; Chuck Moore is the Forth-meister; hell, Bill Gates wrote MS BASIC (at least in part, in assembler); WTF has Bjarne Strouestrup ever done?
You should be expected to study how to write OS's and rendering programs. You should be able to put graduates in a room with a spec sheet and a computer, expect them to tell you what information is missing or volatile on the spec sheet, tell you how long it will take them, and what language they would be most comfortable using to write the program, and they should be able to write it on the provided computer without downloading any additional programs.
I disagree with all of this. Estimating completion time comes from industry experience, not training. What does "volatile information on a spec sheet" even mean? Are you talking about figuring out what requirements in a requirements doc are likely to be changed mid-project? That's a valuable skil, for sure, but agian that comes from years of industry experience.
And as for writing a (non-trivial) program without downloading additional software: half the programmers I know would walk out if asked to use anything but VI to code, and the other half would walk out if forced to use VI. Programmers develop attachments to tools, and I'm not sure what you'r trying to accomplish by asking people to not use the tools they're comfortable with.
Just in general, the ability to keep going if the "hit a wall" is almost the *definition* of a senior programmer. The more unusual the issue you can work around without help, the more senior you are (Well, for the first few years, anyhow).
There are many legitimate complaints about CompSci programs today, but it seems like *you* just hate mentoring junior programmers. These aren't problems that a school will fix, these are problems that real-world experience fixes. There's a reason why your second real devlepment job (normally) pays a lot more than your first!
Socialism: a lie told by totalitarians and believed by fools.
C++ is C with optional safety-less AK-47s. The top 1% enjoy it, the next 9% live with it, and the other 90% die bemused in a hail of friendly fire.
Bjarne is now dissing the students. While this is a time-honoured prof activity, he might watch to consider that the students you get is more a reflection on yourself than the pool as a whole. You build shit, and they will come.
Ahem...
(I agree with your fundamental point, by the way; I just thought that particular choice of analogy was amusing.)
"[Regarding the 'cloud,'] ownership was what made America different than Russia." -- Woz
I agree 100%. All the academic background in the world doesn't prepare you for what the school of hard knocks does. 2-3 years on the job programming taught me more than any school could. We all know the academic solutions, but do we ever use them?
You obviously have only learned half the story on inheritance. MI is a good thing, its just that most modern languages don't implement it because its hard for the compiler writers.
If interface inheritance was such a obvious and perfect option, why is it that Java (and other Java-a-like languages) provide implementation inheritance?
MI (and operator overloading) is good, as a java programmer, if you had it you'd be singing its praises.
Well, if you want to motivate a child, perhaps you do have to have the latest and greatest, or at least something with some cool factor.
I'm not so sure. The "cool" part of playing with the old machines is that there was little abstraction back then keeping you away from the bits. If you poked the right memory location with the right number, the pixels on your screen would change. Poke another bit and you'll hear a click on your speaker. That's very cool, in my old timer opinion, and something the kids today almost never get to see. Everything they're learning is so abstract that they don't understand why anything actually works. How boring that would be...
Devon
" MI is a good thing, its just that most modern languages don't implement it because its hard for the compiler writers."
The problem is that, as the MI mechanism in C++ so excellently demonstrates, coming up with a good way of doing it that doesn't introduce at least as many problems as it solves is what's difficult, not implementing the mechanism itself. An excellent example of this is a common MI ambiguity caused by multiple base classes having member functions with the same names and input parameters. C++ handles this situation via kludges of such epic proportions that calling it "a designed feature" would be stretching the term to a degree where one would also have to call the ability to ruin electronic devices when poured into them a "designed feature" of soft drinks.
I'm not going to change your sheets again, Mr. Hastings.
Wrong. I am not American. Guess from where I am...
... from another third world country that suffers some of the same problems as the Indians.
My point was that you were missing the fact that slashdot is not entirely composed of Americans. So your question "who cares" should raise a couple of "I dos"
-- dnl
I'm not saying interface inheritance is a bad thing, just that having it as the only option is bad, and that if you're going to allow implementation-inheritance lite (ie single inheritance of a class), you might as well have given everyone full MI.
Apparently Anders said he didn't put MI into Delphi because it would slow down the speed of the compiler. I heard it was because he said no-one ever uses MI (I think the former is much more likely as loads of people use MI - that's why you see so many posts asking how to emulate MI using interface-inheritance).
There's only 1 problem with MI - the diamond pattern. God knows there's enough other issues with Java/C#/etc that you have to understand, 1 more surely wouldn't hurt, especially one so well documented on the web already.