Announcing: Slashdot Deals - Explore geek apps, games, gadgets and more. (what is this?)

Thank you!

We are sorry to see you leave - Beta is different and we value the time you took to try it out. Before you decide to go, please take a look at some value-adds for Beta and learn more about it. Thank you for reading Slashdot, and for making the site better!

Twenty Years of Dijkstra's Cruelty

timothy posted about 6 years ago | from the pleasant-legacy dept.

Education 727

WatersOfOblivion writes "Twenty years ago today, Edsger Dijkstra, the greatest computer scientist to never own a computer, hand wrote and distributed 'On the Cruelty of Really Teaching Computer Science' (PDF), discussing the then-current state of Computer Science education. Twenty years later, does what he said still hold true? I know it is not the case where I went to school, but have most schools corrected course and are now being necessarily cruel to their Computer Science students?" Bonus: Dijkstra's handwriting.

Sorry! There are no comments related to the filter you selected.

The Text (5, Informative)

eldavojohn (898314) | about 6 years ago | (#25959273)

For those of you looking for some old fashioned HyperText Markup Language, here is a transcription of the 892 KB PDF to HTML by Javier Smaldone [utexas.edu] .

While the handwriting is a novelty (and the PDF is actually small for a PDF), I question how long that server is going to last.

Also (and yes this is nitpicking), I must contest this:

Edsger Dijkstra, the greatest computer scientist to never own a computer

I submit for consideration Alan Turing [wikipedia.org] who may have designed the ACE and worked on the earliest computer (The Manchester Mark I [wikipedia.org] ) although never really owned it or any other computer. I think a lot of people identify him as not only a hero of World War II but also the father of all computers.

Re:The Text (0)

Anonymous Coward | about 6 years ago | (#25959329)

Either way, 'the greatest' is unnecessarily subjective. He should've just gone with 'one of the greatest'.

Re:The Text (5, Funny)

wilder_card (774631) | about 6 years ago | (#25959813)

What do you think this is, wikipedia?

Charlie Rangel: Change we can believe in (-1, Troll)

Anonymous Coward | about 6 years ago | (#25959369)

http://www.politico.com/news/stories/1208/16114.html [politico.com]

It's about time somebody addressed this ashy-faced nigger's corruption. His biggest ethics violation has yet to be investigated, though: his annoying voice. What, did someone get fed up with him and punch him in the throat or something?

Re:The Text (3, Insightful)

dkleinsc (563838) | about 6 years ago | (#25959629)

I'd think Ada Lovelace would have a better claim there, given that not only did she never own a computer, they didn't even exist and there was at the time no such thing as a "program".

Re:The Text (1)

Chode2235 (866375) | about 6 years ago | (#25960159)

You throw out Turning's before Babbage?

Did your CS program have no history requirements?

Re:The Text (1)

serviscope_minor (664417) | about 6 years ago | (#25960171)

I submit for consideration Alan Turing who may have designed the ACE and worked on the earliest computer (The Manchester Mark I) although never really owned it or any other computer. I think a lot of people identify him as not only a hero of World War II but also the father of all computers.

What about Konrad Zuse? He not only owned his computer, but he built it from scratch himself out of of metal (and later relays). Who is he? If he's not eh father of computers he must at lease be the "big daddy" of all computers?

Re:The Text (3, Informative)

Packet Pusher (231564) | about 6 years ago | (#25960227)

The Dijkstra wiki link said he owned a Mac for email and web browsing. How can they expect us to read the links if they aren't going to themselves.

Re:The Text (0)

Anonymous Coward | about 6 years ago | (#25960257)

Edsger Dijkstra may have been smart, but he came across as a troll.

Mine was certainly cruel to us (5, Funny)

MikeRT (947531) | about 6 years ago | (#25959303)

They made us do mostly Java, even though a number of us could do C or C++.

Re:Mine was certainly cruel to us (1)

Anonymous Coward | about 6 years ago | (#25959385)

Mine taught COBOL, except for those courses where they required to know Java.

Re:Mine was certainly cruel to us (1)

91degrees (207121) | about 6 years ago | (#25959395)

Oh woe! Not having to worry about pointers and having built in string types.

I love C. It's terse and really useful for optimising performance but it's really not a good teaching language.

Re:Mine was certainly cruel to us (0)

scubamage (727538) | about 6 years ago | (#25959667)

I learned C first, specifically the UNIX filter style of programming and it honestly made learning Java a PITA. I had the worst time ever grasping OOP. Even worse though we had a professor who sucked and by the end of our first semester we couldn't even program a hello world application. Luckily the prof after that moved us over to C++ and it all started making sense again. I still dabble with Java, and I rather enjoy it now that I finally got myself to realize how OOP works. C is still a great starting point if you never intend to dabble outside of procedural programming though.

Re:Mine was certainly cruel to us (3, Insightful)

mmkkbb (816035) | about 6 years ago | (#25959849)

Honestly, it's most important to learn how to learn new languages than to learn any specific one. The specific language will change far more often than the concepts they represent.

Re:Mine was certainly cruel to us (4, Informative)

DiegoBravo (324012) | about 6 years ago | (#25959929)

You're right. Also Stroustrup had clearly pointed (in other argument lines) that C is not the better way to learn C++ (or OO in general):

BEGIN EXCERPT from http://www.research.att.com/~bs/new_learning.pdf [att.com] :

        One conventional answer to the question ''Which subset of C++ should I learn first?'' is ''The C subset
of C++.'' In my considered opinion, that's not a good answer. The C-first approach leads to an early focus
on low-level details. It also obscures programming style and design issues by forces the student to face
many technical difficulties to express anything interesting.

Re:Mine was certainly cruel to us (1)

AceofSpades19 (1107875) | about 6 years ago | (#25960089)

There is too much theory to learn in order to write a simple program in java that confuses people compared to C

Re:Mine was certainly cruel to us (5, Interesting)

chrb (1083577) | about 6 years ago | (#25959965)

My old university dropped C and replaced it with Java for all CS courses apart from Operating Systems. I asked one of the professors why - he said many students complained that dealing with pointers was too hard, and that the rise of Java and Java programming jobs meant C was obsolete and pointless, that the issue of programming languages came up on prospective student visit days, and that in order to be "commercially attractive" to these potential students they had to switch. We even used to do assembly language programming in the first year - now, the replacement course teaches students how to use Eclipse for Java programming.

Several years later I was back tutoring, and I was very disappointed to find out that I had to explain pointers and pointer arithmetic to people who were almost at the end of their Computer Science degree, and who didn't understand why their code was crashing with "null references" when "Java was supposed to get rid of all that memory stuff!".

Re:Mine was certainly cruel to us (1)

ardor (673957) | about 6 years ago | (#25960057)

C obsolete and pointless?
With the exception of mobile phones (which is a rigidly locked-down market anyway), virtually any embedded device you can find has soft/firmware written in C or C++. And, the embedded devices market is vastly greater than the PC or server one. So, tell the professors to get a clue.

Re:Mine was certainly cruel to us (1)

Thaelon (250687) | about 6 years ago | (#25960339)

What's wrong with learning Java?

I'm not being a jerk here, I want to know why you think it was so bad.

I think there's nothing wrong with learning java as long as you get some real experience with C/C++ and assembler before you graduate so that you understand what the high level languages are doing for you behind the scenes (character arrays, memory allocation, pointers, for starters).

Slight disclaimer: I did assembler in college, and C on an OpenVMS VAX (isn't government work awesome?) prior to becoming a java developer.

After that stuff, Java is easy.

Difficulty (1)

nitsnipe (1332543) | about 6 years ago | (#25959359)

I'm a high-school student and I know that most people here can't even pronounce his name.

Hmmm... (0, Troll)

Phasma Felis (582975) | about 6 years ago | (#25959367)

Wasn't Dijkstra the one who said "Computer Science is no more about computers than astronomy is about telescopes"? Great as he was, I'd say in the modern era he's part of the problem, i.e. CS programs producing students who know loads and loads of theory and can't write a damn line of actual code.

Re:Hmmm... (4, Insightful)

ExtraT (704420) | about 6 years ago | (#25959419)

I agree that teachers disconnected from reality are bad, but the alternative is even worse. Look at what too much bitching got us: they teach JAVA as the primary programming language in universities nowadays! How sadistically cruel is that?

Re:Hmmm... (4, Insightful)

fbjon (692006) | about 6 years ago | (#25959477)

There's nothing exceptionally wrong with Java as a starting language, though I may be biased since that's what we had. In any case, my uni has now switched to Python, which is probably even better.

Re:Hmmm... (1)

danieltdp (1287734) | about 6 years ago | (#25959761)

Java is not the best choice, but it is a wiser one than C, for example. The guy has to forget a little about memory management and pointer arithmetics on his first steps. After he has some experience with programming he can get into low level details

I had professionally worked with a couple of languages, which includes Java and python. That being said, I see strengths on both languages but I think python is a better choice for introductory courses.

One thing that I believe is very important is to make them program in more than one language. CS majors should understand that there is no silver bullet. Each language has its place and time and a good professional have to be ready to handle more than one tool.

Re:Hmmm... (3, Interesting)

MadnessASAP (1052274) | about 6 years ago | (#25959943)

I think they should teach low level first, teach students assembly first and work up from their. They don't need to create anything fancy in assembly just make sure that they understand how a computer works and does things rather then the abstracted model that higher level languages give you.

Re:Hmmm... (2, Interesting)

argiedot (1035754) | about 6 years ago | (#25960383)

I strongly disagree. I see this attitude everywhere and while people who are already really motivated, you will kill off even the least interest in a student who could later find it all fascinating.

You have to engage students. They aren't automatons who will simply take in any information at the same rate. I understand that you're talking about undergraduate college, and that the system is probably different depending on which country you live in, but you have to start at a level where it is easily possible for a student to _do_ things, and that's how you pique someone's interest and sustain it.

I've been through two computer science courses (one introductory, one advanced) in college as part of my Math degree, and through a year in school of being taught C, and while to me it was interesting (I had a computer much earlier than any of my classmates - back when I was just out of primary - so I had an advantage), quite a few of my classmates were obviously struggling with the "This seems so useless, just learning a bunch of stuff for no reason." idea.

I know, they're in a Math course, and stuff like that, but there are a lot of people who will probably be capable of first-rate programming, but they will likely be scared away by having to write a 10 line cryptic bunch of codes just for Hello World.

Besides, Computer Science is about Computer Science anyway, not just the instruction set of one particular processor.

Re:Hmmm... (4, Interesting)

DarenN (411219) | about 6 years ago | (#25959871)

There's nothing exceptionally wrong with Java as a starting language

Yes, there is. It insulates the student from some concepts that are important and because it's so aggressively object orientated even the standard "Hello World" program requires quite a bit of glossing over by the teacher.

As a result, it tends to get waved away as "magic" or "this will be explained later" but there's so much waved away that the students get disconnected. For instance, to simply output a line to a command line in Java you're looking at
whereas with c++ (for instance) you have
cout << "output" << endl;
As someone who's teaching this stuff, the second is easier to explain in detail and doesn't rely on saying "don't worry what System.out is".

The other prime example when teaching object orientation is garbage collecting. Students who learn in Java are significantly more difficult to teach about dynamic memory and the necessity of cleaning up after themselves than those who've learned in other languages that don't abstract this away. It's much easier to switch from C/C++ to Java than the other way around.

The standard way of teaching basic programming is procedural, then functional, then object orientated then onwards. Using Java to teach in that cycle is nuts. How useful that cycle IS is another question, of course :)

Re:Hmmm... (4, Insightful)

doti (966971) | about 6 years ago | (#25960295)

you serious?

to me, system.out.println looks way more reasonable than this "cout << endl" thing.

Re:Hmmm... (0)

Anonymous Coward | about 6 years ago | (#25960357)

Yes, but in order to teach that you also have to teach all these things about object orientation which can easily get in the way.

There's a lot of coding work out there that is partly or wholly not object-oriented (either for historical reasons or because it's part of an embedded system), and to pretend that everything has to be object oriented does students a disservice. It would make more sense to do some pure C modules, at least in the first year, so you learn about ideas like having to free memory once you've used it.

Re:Hmmm... (4, Funny)

ZeroExistenZ (721849) | about 6 years ago | (#25959437)

i.e. CS programs producing students who know loads and loads of theory and can't write a damn line of actual code.

Ofcourse I can write a line of code!
Behold, in al its glory:

printf("hello world");

Re:Hmmm... (5, Funny)

16384 (21672) | about 6 years ago | (#25959581)

cat > hello.c
printf("hello world");
gcc hello.c
hello.c:1: error: expected declaration specifiers or '...' before string constant
hello.c:1: warning: data definition has no type or storage class
hello.c:1: warning: conflicting types for built-in function 'printf'

Re:Hmmm... (0)

phasm42 (588479) | about 6 years ago | (#25959755)

Line of code != Compilable program

Re:Hmmm... (0)

Anonymous Coward | about 6 years ago | (#25960117)

perl -e 'printf("hello world");'

Re:Hmmm... (5, Informative)

mhesd (698429) | about 6 years ago | (#25960255)

cat > hello.pl
printf("hello world\n");
perl hello.pl
hello world

Professionals should know their tools (4, Insightful)

mangu (126918) | about 6 years ago | (#25959527)

CS programs producing students who know loads and loads of theory and can't write a damn line of actual code.

I agree with that, but it isn't only in CS courses that programming should be taught.

The problem I see in current engineering and sciences courses is that they don't teach numerical analysis. Engineers and scientists today try to do everything in matlab or excel, except for those that do postgraduate courses, who often try to do things in fortran.

Programming languages are tools that anyone involved with advanced uses of computers should learn to use. If you are a professional you should know how to use professional tools.

Professionals should know their math. (1)

Ostracus (1354233) | about 6 years ago | (#25959687)

"The problem I see in current engineering and sciences courses is that they don't teach numerical analysis. Engineers and scientists today try to do everything in matlab or excel, except for those that do postgraduate courses, who often try to do things in fortran."

Maybe in computer engineering they might but I learned mathematical analysis right off the bat and no it wasn't post doc. It's kind of hard for one to call themselves an engineer and not know that.

Re:Professionals should know their math. (1)

astrodoom (1396409) | about 6 years ago | (#25960079)

I have to agree. I'm an Electrical Engineering major and we have plenty of classes on numerical analysis. As a matter of fact we have one course called "Numerical Techniques in Engineering" that is a required second year course. Depending on the professor you get this class will contain varying amounts of Matlab, but it mainly stresses the techniques themselves. We also have a decent programming requirement (not great, but they're working on improving it now) which requires two courses in programming for those unfamiliar with it, and one for those who pass the competency test (The classes are general in theory, but use C/C++ for the application). It used to just be a single class in C, which was almost completely practice with only 2 classes spent on anything general to programming.

Re:Professionals should know their tools (1)

internerdj (1319281) | about 6 years ago | (#25959707)

That's great. Our school had 3 separate Java classes, 3 separate C classes, and 3 separate C++ classes: all in 3 different departments. The CPE and CS departments both offer a MS in Software Engineering and their curiculums are nearly identical except most of the classes are taught in both departments with different course numbers... With a budget crunch where they are paying only 75% of the instructor's salaries you would think someone would get a clue about the redundancy. And numerical analysis belongs in the Math department because it is as important to any other engineering field as it is software engineering, which it is at my school.

Re:Professionals should know their tools (5, Funny)

jazzduck (1180033) | about 6 years ago | (#25960101)

Our school had 3 separate Java classes, 3 separate C classes, and 3 separate C++ classes: all in 3 different departments.

Silly. This can't be true. Everyone knows that there are no classes in C.

Re:Professionals should know their tools (5, Insightful)

thermian (1267986) | about 6 years ago | (#25959781)

I don't think you can lay the blame for students knowing less on the department that they attend.

Mine taught a good mix of coding and theory, but we still had morons who didn't do enough coding to actually learn their craft well, and people who learned the coding but didn't learn enough theory to get decent course grades.

The point is, while at university studying computer science or any other subject it is your own responsibility to teach yourself around the subjects you are introduced to in the classroom.

I was taught using Java and Delphi, and yet finished my degree as a pretty competent C coder, in spite of never having attended a class on that language.

I also studied a great deal more around the subjects then many of my peers. Those who did the same as me tended to do well on graduation, I went on to more years of poverty as a Ph.D student myself.

Re:Professionals should know their tools (1)

WhiplashII (542766) | about 6 years ago | (#25960297)

people who learned the coding but didn't learn enough theory to get decent course grades

If I am understanding you correctly, this is the problem. Grades are supposed to measure the effectiveness of your learning. You are supposed to be learning how to be a useful programmer. If useful programmers are getting poor grades, an idiot has set up the curriculum...

Re:Professionals should know their tools (1)

thermian (1267986) | about 6 years ago | (#25960371)

people who learned the coding but didn't learn enough theory to get decent course grades

If I am understanding you correctly, this is the problem. Grades are supposed to measure the effectiveness of your learning. You are supposed to be learning how to be a useful programmer. If useful programmers are getting poor grades, an idiot has set up the curriculum...

No, I mean they didn't apply themselves to the task of learning. If your teacher isn't that good, but you have to know the subject, study at home or in the library. I had to once or twice to compensate for crap lectures.

If the entire department sucks, well thats a different problem, but frankly I'd suspect such a situation would be quite rare.

University != school you know, you are there to teach yourself as much as be taught.

Re:Professionals should know their tools (1)

NotQuiteReal (608241) | about 6 years ago | (#25960049)

CS != programming.

The current "professional tools" for programming change. The fundamentals of CS, much less so.

Knowing the CS helps you select the proper tool. Many tools actually hide the CS from the programmer.

Re:Hmmm... (5, Insightful)

RobKow (1787) | about 6 years ago | (#25959645)

I'd have to say in recruiting software engineers I have much more of a problem with theory-light code monkeys than I do with non-coders that are well-versed in CS theory. With the former you wind up with people who can't leave whatever language they're most familiar with and don't really understand why what they're doing works (cargo cult programming). It's easier to teach good coding practices in the field than it is CS theory.

My technical interviews aren't full of riddles or obscure CS theory questions, but I ask a series of pointed questions to see if the candidate has a good familiarity with the various language families (not just particular languages), common data structures (they should at least have encountered them, even if they need to look them up to implement them), and can talk in terms of pseudocode and algorithms instead of just library functions and language idiom. Language experience is a plus, but definitely not required.

Re:Hmmm... (1)

wilder_card (774631) | about 6 years ago | (#25959841)

As opposed to IS students, who can write reams of code but have no idea what's actually going on?

Re:Hmmm... (4, Insightful)

amorsen (7485) | about 6 years ago | (#25959883)

i.e. CS programs producing students who know loads and loads of theory and can't write a damn line of actual code.

That's because CS programs are misnamed. Most coding should be done by engineers, not scientists. A Master in Physics doesn't necessarily qualify you to build bridges either.

Re:Hmmm... (1)

hey! (33014) | about 6 years ago | (#25960123)

Well, sure. Students should be able to write a bit of code, but why should software engineering be different from any other engineering?

When you get out of school with a freshly minted degree, you ought to have some knowledge of how bridges are built. Bridges are the civil engineers fetish objects, after all. But nobody trusts you to design one. About the only thing they'll trust you to do is to calculate how much paint will be needed to paint the lines on the roadway. If you don't screw that up, maybe they'll let you calculate how much paint goes on the bridge itself. Succeed there and they'll let you check somebody else's calculations.

This is not to say students shouldn't learn programming. They should, but we should be mindful of diminishing returns and the uniqueness of this opportunity in their careers. If you are programming for your career, you are constantly getting better at the craft, but when will you become better at the theory? You are bounded by the things you have done and thoughts you have had, and perhaps you can push those boundaries back, but not as much as the whole scope of human thought on the subject.

Re:Hmmm... (2, Insightful)

camperdave (969942) | about 6 years ago | (#25960185)

He's right, though. Writing the code is secondary. What matters is algorithms, data structures, proper analysis. Anyone with a computer and an internet connection can learn how to write a line of code. Heck, a modern integrated development environment almost writes the code for you. However, knowing what to write is a lot more important than knowing how to write it. One can write iterative code for traversing a linked list, or one could write recursive code. Knowing which is best can be what separates the hacker from the script kiddie.

Re:Hmmm... (5, Interesting)

swordgeek (112599) | about 6 years ago | (#25960201)

Dijkstra's comments were right on the mark, and fairly obvious to people outside of CS. They were only contentious within the field, for some odd reason.

The thing is, Computing Science should be approached in the same manner as most other science fields: A BSc in computing should be about theory, research, and pushing the state of the art. A modicum of programming is probably necessary to accomplish that, but programming should understood in the abstract--without the emphasis on 'this command, this language.' Learning to be a programmer (a) should be a division of computer engineering, or (b) probably not a degree at all. More like a one or two year college certificate.

Chemistry, Physics, Biology, Math, and so forth, are all degrees aimed at research and study, not commercial production. Why not computing?

Exactly (2, Interesting)

chfriley (160627) | about 6 years ago | (#25960409)

That is spot on. It is the difference between an electrical engineer and an electrician. They don't do the same things and getting an EE to wire your house is as stupid as getting an electrician to design a CPU. Or you don't go to the engineer at GM who designed the engine of the car to change your oil (although given the state of Detroit that might change).

There is a difference between a CS degree and an IT or Software Engineering some other more hands-on degree. Yes, a CS or Comp Eng degree should have coding, that is a must because you need to implement a stack or queue or linked list to really understand it. Ditto for LISP or Prolog in AI or knowing a bit of C if you are into OS design (e.g. for Unix/Linux, so you can understand it). But the focus is on theory so that you can code efficiently (or tell the IT people, look, your coding is good, but the design is O(n^2) and you could code it so that it is O(n) or whatever). Or to tell them P NP or whatever.

I was just starting grad school at UCSD in CS when he wrote that paper and there are two separate fields here just like a builder vs an architect or plenty of other examples. One is not better than the other, just different with a different focus and just depends on what the person is interested in and wants to be skilled at. It is not widely understood though. When people find out I was a CS person, I get, "Oh, can you fix Windows for me?"

engineering (2, Insightful)

Lord Ender (156273) | about 6 years ago | (#25959399)

Regardless of the state of Computer Science, what most students studying the subject really are after is software engineering. The world doesn't need more people arguing over P=NP; it needs people who can build (and manage projects to build) software systems which solve real-world problems.

Re:engineering (0)

argent (18001) | about 6 years ago | (#25959633)

Software Engineering, then, is what you do when you write a document using Microsoft Word or create a website using Front Page? Well, that's certainly consistent with the definition of engineering, but it's got nothing to do with writing software.

Once you start actually writing code knowing the mathematics behind computation is pretty much essential. Otherwise you inevitably end up with code that's got non-linear processing requirements, sooner or later, and that's a hole Moore's Law can't dig you out of.

Re:engineering (4, Insightful)

Lord Ender (156273) | about 6 years ago | (#25959787)

I don't know what you think FrontPage has to do with anything. Perhaps you're just trolling?

Software engineers should understand use case analys, user interface design, project management and finance, and many other important subjects "computer science" curricula ignore while beating students over the head with details theory. Understanding issues of scalability is good (though often actual testing is used in the engineering world for practical reasons), but we don't need four years of that while ignoring more important topics.

I'm not saying exhaustive study of the mathematical theory of computation is bad. I'm saying students are badly served at most universities by focusing on that at the expense of other topics.

Re:engineering (1)

amorsen (7485) | about 6 years ago | (#25959923)

Civil engineers need to know a bunch of mathematics in order to build bridges. Software engineers need to know a lot of mathematics in order to make software. That doesn't mean that civil engineers are physicists or that software engineers are computer scientists.

Re:engineering (1)

mattMad (1271832) | about 6 years ago | (#25959733)

The world doesn't need more people arguing over P=NP;

I would argue that the world needs more people (software engineers) that at least understand what the problem of P=NP is all about. Good software engineers know (and care) about the computational complexity of the stuff that they are producing.

Re:engineering (1)

Lord Ender (156273) | about 6 years ago | (#25959869)

They care about scalability, yes. But there are many other things they care about which computer science curricula ignore.

Re:engineering (1)

mattMad (1271832) | about 6 years ago | (#25960059)

I totally agree with you on that. My point is that you should not throw out fundamental stuff like computational complexity in favor of topics that directly apply to "real-world problems". I think the challenge is to find a good mixture including enough of both types.

Re:engineering (0)

Anonymous Coward | about 6 years ago | (#25959859)

Dijkstra talks about software engineering in the paper and says its charter is "How to program if you cannot". Knowing a tool without the theory behind it is as useless as knowing the theory of a tool without knowing how to use it.

Re:engineering (1)

Lord Ender (156273) | about 6 years ago | (#25959983)

I would argue that most humans, and in fact most programmers, "cannot" by his definition. The demand for software systems greatly out paces the supply of Dijkstras, so the ability to produce useful software using a team of mere mortal programmers is the more valuable skill.

Re:engineering (1)

AKAImBatman (238306) | about 6 years ago | (#25960125)

Dijkstra talks about software engineering in the paper and says its charter is "How to program if you cannot".

A lot has changed since Dijkstra wrote his paper. A real need for systems based on off the shelf technology has developed in the marketplace. Thus a software engineer is to a computer scientist what a building engineer is to a physicist. The engineer uses the theorems of the scientist to accomplish his task, but he does not himself work toward the furthering of science.

In Dijkstra's time, computers tended to be massive beasts that were deployed with a small army of programmers and hardware specialists to maintain. COBOL programmers were not programmers in the truest sense, but rather business analysts who translated business rules into instructions a computer could understand. The engineering had already been done by real computer scientists.

Such is no longer the case. If I wish to deploy a complex web application, it needs to be properly engineered to handle the volume, to scale as needed, to account for I/O bottlenecks, to ensure intelligent action in the case of network failure, to provide secure access, and a host of other common issues. The needs of such development go far beyond the confines of "purchase a mainframe and attach terminals and printers". Real planning and engineering has to go into everything from choosing the servers, the database technology, the application platform, supporting technologies, and even (more recently) the performance of the Javascript that runs in the user's browser.

As such, I honestly think that computer science and software engineering should be split off into separate disciplines. Right now, very few people understand the difference. Software engineering is very much a trade that can be taught as a form of applied computer science. Computer science is still about furthering the understanding of information, the mathematics behind it, algorithms to improve efficiency, and the methods by which the logic can be expressed in the real world. (I recommend a minor in quantum physics if you plan to develop new computational machines!)

Re:engineering (1)

hey! (33014) | about 6 years ago | (#25959957)

I dunno. The world doesn't "need" people arguing over anything. It needs certain side effects of argumentation.

Anyway, nobody I know believes that P=NP. If it were proven, then it certainly would be a highly practical result.

If it turns out that PNP, that is also very practical. Assuming that (as most people do) means that we have a mathematical test for feasibility. This is practically unique in engineering. In civil engineering, a bridge with a span of a hundred feet is obviously feasible, and a bridge with a span of a thousand miles is almost certainly unfeasible, but nobody can say where the dividing line comes, the point where introducing new materials, clever truss designs, and shear overbuilding cannot stretch the span another centimeter.

In fact, in engineering when you run into something remotely like that, it's not considered engineering; it's physics. A mechanical engineer will look at a contraption and decide it is impractical because it violates the laws of thermodynamics. Exactly why the thermodynamics are as they are is a profound question which doesn't very much concern the engineer, but they were well established empirically long before theoretical physics was ready to even speculate. P NP is analogous, in that the evidence for it is empirical and as solid as empirical evidence can be. It just ought to be provable or disprovable mathematically, as it'd be nice to formulate thermodynamics in terms of a more fundamental theory.

In any case, having been in the business for a long time, the line between software engineering and theoretical computer science is twisty and dynamic. The rise of Internet businesses gave software engineering a serious kick in the pants, both in terms of construction techniques, but also in terms of algorithmic design. Google is a company founded on special expertise in algorithms. Amazon and Netflix are companies that make considerable use of algorithms for marketing purposes; this may not be as precise as we'd like it to be, but as in Asimov's psychohistory, it's the statistically aggregated results that count.

Re:engineering (1)

Yvanhoe (564877) | about 6 years ago | (#25960113)

Because we all know that a scientific background is a terrible thing to have as a technician.

Re:engineering (1)

Entrope (68843) | about 6 years ago | (#25960145)

You've hit on the point where Dijkstra's hypothesis fails. He wants Computer Scientists to formally think about programs and write code that can be formally proven to meet the equally formal specification. There are important problems (like cryptography, banking, secure kernels, and more) that can benefit from that approach, but many more programs in the real world are mostly solving user interface problems. Sure, they access databases and implement business logic, but the primary drive is what the user wants the system to do.

The vast majority of development money spent today is on user-centric programs where there is no single solution; where we do not have the language to create formal specifications, at least to the point of being able to prove compliance; and even if we had such a language, the users and customers who specify programs would not want to bother with it. The people who pay the bills typically do not want to spend the time and money to create that kind of specification for piddling details like keeping private data private -- not when there are real dollars that can be saved by __(fill in the blank)__.

Depends on the school (1)

RingDev (879105) | about 6 years ago | (#25960271)

I've taken CS classes at a few different Universities and Tech Colleges.

At the Unis I learned theoretical stuff that as a business application developer I will never use. I will never bill my employer/consult to build a new compiler from scratch. Knowing the intricacies of how compilers work has never contributed significantly to my ability to debug a code problem. That said, they did a fair job of what they were trying to do: spit out scientists who could further the field of computer science.

At the Tech schools I saw a ton of technologies. SQL, SQLServer, C++, C#/VB.Net, Java, HTML, CSS, Javascript, Access, etc... tons of hands on lab time. And walking out of a tech school program I felt they did a great job doing exactly what they were trying to do: spit out working class programmers who could hit the ground running on day 1 in a wide variety of entry level contractor jobs.

Neither option is perfect. Going to a University you'll miss out on the actual practical coding, so while you might be able to pointer math in your head, you'll be way behind the curve in application development. Going to a tech college, you'll have a great framework to start from, but you'll have none of the in-depth or more advanced technical knowledge that someone with a university degree will have.

In both cases I found the knowledge transfer on application design to be completely lacking. Limited exposure to design patterns. No coverage of data abstraction or n-tier designs. Course work on customer interactions, requirements gathering, documentation, and project management were completely lacking (although the tech colleges did a fair bit of PM and Business focus in their Bachelor's program).

When I'm looking at college grad resumes, from a programmer's perspective I want to know that they can:
1) Code in 2 languages (preferably with different fundamentals)
2) Understand some amount of design theory
3) Manage their time
4) Interact well with users and coworkers

And for the love of all things binary, if they try to answer the "Swap the values of A and B" with out creating a 3rd variable on the screening test, they get round filed. I don't care if an instructor showed them a neat trick with pointers, answer the question the right way and save the flaunting for personal projects.


When I was your age... (1)

ittybad (896498) | about 6 years ago | (#25959415)

When I took my C++ Data Structures course, our final was 36 pages long. We had to hand write our code answers. That was cruel. That was in the ol' year 2000.

Re:When I was your age... (1, Funny)

Anonymous Coward | about 6 years ago | (#25959541)

You had hands? You kids are so spoiled these days.

Cruel and couldn't use a computer (4, Insightful)

noldrin (635339) | about 6 years ago | (#25959423)

Sounds like a typical computer science professor. Mine usually couldn't use a computer at all. And yes, mine were generally very cruel. Giving examples that months later they figure out were wrong, making us code with pen and pencil, teaching fake assembly languages and fake operating systems.

I'm glad I left, cause I can actually now use a computer, unlike much of the coders I come across. If you like computers, don't go into computer science. That is for people who enjoy math and theory.

Re:Cruel and couldn't use a computer (5, Insightful)

Malc (1751) | about 6 years ago | (#25959745)

Why is fake assembly and fake OS cruel? It's computer science, not a vocational tech course. They've presumably tried to bypass the issues of real-world systems that distract you from learning the point. Once you've got the basic concepts, any OS and any language become approachable - why would you want to learn something specific that would be out-of-date in short measure? Seems rather myopic to me.

Re:Cruel and couldn't use a computer (0, Redundant)

Anonymous Coward | about 6 years ago | (#25959919)

Why does it have to be a choice between teaching coding and teaching theory? Why not do both, and do both well?

What's wrong with adding a full-year course in the final year, covering actual in-the-field coding techniques?

Re:Cruel and couldn't use a computer (3, Insightful)

SatanicPuppy (611928) | about 6 years ago | (#25959921)

In a practical field where you can do real assembly and work on a real OS, you ask why doing fake make-work is cruel?

Theory is fine, but theory shouldn't trump practical application in a field where practical applications are everywhere.

Re:Cruel and couldn't use a computer (1)

TheRealZero (907390) | about 6 years ago | (#25959933)

Exactly. I mean, all this practical hands-on work they've been giving me in Computer Systems Technology is just distracting. I'll never learn the basics of operating systems by learning how to use windows and linux by actually using them. How am I supposed to solve real-world problems with all this relevant practical experience filling up my brain?

Re:Cruel and couldn't use a computer (5, Insightful)

SageinaRage (966293) | about 6 years ago | (#25960067)

It's the equivalent of a biology class detailing the possibilities of life, by examining chemical interactions, without actually examining any actual living organisms.

Re:Cruel and couldn't use a computer (0)

Anonymous Coward | about 6 years ago | (#25960331)

"Sounds like a typical computer science professor. Mine usually couldn't use a computer at all..."

If you don't know who Dijkstra is, and were in a computer science degree, I'm going to bet that you didn't even get to Dijkstra's Algorithm, let alone semaphores.

I'm willing to wager that you "left" in second year... Which of course makes you an expert in the topic of what computer science is and isn't.

It scares me that I used to behave like you.

Cruel to be kind (5, Insightful)

MosesJones (55544) | about 6 years ago | (#25959433)

The aim of a really good degree (as opposed to a lecture driven box ticking one) is to be cruel, you want to feel that your head is going to explode and that your subject really is an absolute bitch.

Then you graduate and find out the real world is easier than the theory.

Cruelty is important in a good education to make you achieve in the real world. An easy flow through degree gets you the cert but gives you unrealistic expectation of how hard the real world can be.

Personally my degree was a mind bending bitch of mumbling lecturers and impossible (literally in some cases) questions that covered everything from quantum mechanics "basics" and abstract computing theory through to how to dope a transistor.

It was cruel, it was unusual... it was great.

Re:Cruel to be kind (3, Insightful)

140Mandak262Jamuna (970587) | about 6 years ago | (#25960281)

The cruelty is not being inflicted upon the students, it is on the teachers. All these dumb kids got through high schools with endemic grade inflation, not knowing the first thing about anything but with some supreme self confidence. Teaching them anything is difficult. Can't figure out simple free body diagrams in freshman physics, get all confused by the p orbitals and electrons in chmistry, can't differentiate a polynomial if their life depended on it, but they all come and sit in the computer science class and expect to be taught using innovative interesting creative techniques that require no effor on their part. Being a college prof dealing with freshman is a punishment, I tell you.

What's a Computer? (1)

Rary (566291) | about 6 years ago | (#25959509)

Edsger Dijkstra, the greatest computer scientist to never own a computer...

So, his Macintosh wasn't a computer?

Re:What's a Computer? (1)

mangu (126918) | about 6 years ago | (#25959609)

his Macintosh wasn't a computer?

It could have been a raincoat [about.com] ...

Re:What's a Computer? (1)

morgan_greywolf (835522) | about 6 years ago | (#25959863)

Apparently not, if TFS is to be believed. It's important to note that Dijkstra felt that computer science is about computers as much as astronomy is about telescopes -- IOW, not much. But he did -- reluctantly -- purchase a Macintosh, which he used only for surfing the Web and e-mail.

Re:What's a Computer? (1)

morgan_greywolf (835522) | about 6 years ago | (#25959893)

Grrr...Slashdot ate my link [google.com] .

The REAL cruelty is... (0)

Anonymous Coward | about 6 years ago | (#25959523)

...having to spell the guy's name. Out loud. In front of the whole class. While hung over. On a Monday morning.

the greatest computer scientist to never own a com (0)

Anonymous Coward | about 6 years ago | (#25959547)

Alan Turing couldn't have owned a computer.

Handwriting? How about a Font! (4, Interesting)

JoshDM (741866) | about 6 years ago | (#25959567)

Dijkstra's Cruel Font link [tinyurl.com] , so we at least get something recent(-ish) out of this article.

Uh... (1)

cwAllenPoole (1228672) | about 6 years ago | (#25959611)

While there are a number of things this gentleman has correct, there are also a number of dreadful errors here. Two examples: he subscribes to the belief that the Middle Ages were "poor fools" and he denies that Arithmetic is the derivative of physical problems -- one apple and one apple can be written 1a + 1a = 2a.

Cruelty across the board (0)

Anonymous Coward | about 6 years ago | (#25959677)

I am a Software Engineer and my cruelest subject was Electro Magnectics. (Shiver) I think I finally understood it, and then I found out there are left-hand materials too. (Shiver, Quiver)

Do you really need that CS degree? It depends.... (4, Insightful)

zerofoo (262795) | about 6 years ago | (#25959835)

I'm grateful that I have a computer science degree, it has enabled me to have a deeper understanding of all the things I administer on a day to day basis. It is nice to know how spanning-tree actually works on my switches, and how databases actually use data structures to store and retrieve data.

I'm not designing and building these systems, I'm installing, using, and maintaining these systems. Do I need a CS degree to do this? Hardly.

If you like installing and maintaining computer systems, but hate math and theory - don't go for a CS degree. You will be better served by doing your own research/training, getting some certs (RH, MS, Oracle, Cisco...etc) and if you are so inclined, maybe a 2/4 year IT Management degree.

If you want to build the products that people install and use (software more complicated than a web page or login script, hardware, firmware for embedded systems...etc) you will need to endure the math and theory that a CS degree requires (and possibly an Electrical Engineering/Computer Engineering minor as well).


His home university is just slowly recovering (1, Interesting)

Anonymous Coward | about 6 years ago | (#25959839)

I study at the university of Eindhoven, where dijkstra was professor. He certainly left his mark on the curriculum here with constructing programs by proof by using hoare triples and much more.

A lot of the staff here see him as sort of a role model, with the same proofs, handwriting and abrasive personality.

But now the last year most of those subjects are being removed, or reworked to something more manageble. They where so disconnected from reality (proving horners scheme in so many ways gets old quick).

Dijkstra's quote "Computer Science is no more about computers than astronomy is about telescopes" is in my opinion just wrong. Astronomers need to use a telescope and understand its operation.

Re:His home university is just slowly recovering (1)

mbone (558574) | about 6 years ago | (#25960411)

Dijkstra's quote "Computer Science is no more about computers than astronomy is about telescopes" is in my opinion just wrong.

Indeed. It is hard to imagine a more incorrect statement about astronomy (especially if you include all of the wide variety of observing instruments as telescopes).

Recursive Descent (2, Insightful)

tomhath (637240) | about 6 years ago | (#25959853)

"Right from the beginning, and all through the course, we stress that the programmers task is not just to write down a program, but that his main task is to give a formal proof that the program he proposes meets the equally formal functional specification."

Dijkstra was a genius and made many contributions to Comp. Sci. But his suggestion that a program (really a program design) should be accompanied by a formal proof has problems at both ends of the development cycle: how do you prove that the formal specification is what the customer wanted, and how do you prove that the code actually implements the design?

I've seem automatic testing products that claim to do both, but in order to make them work you have to specify every variable and every line of code as the "requirements", then compare what the tool thinks the result should be to the output of the program. And yes, the vendor suggested that the business analysts write the formal requirements; you can imagine how well that worked.

Real-world cruelty (2, Funny)

Ukab the Great (87152) | about 6 years ago | (#25959873)

"Right from the beginning, and all through the course, we stress that the programmer's task is not just to write down a program, but that his main task is to give a formal proof that the program he proposes meets the equally formal functional specification."

Where exactly do semi-formalized, poorly thought-out specifications handed to you half-written out on a napkin and constantly subject to change fit into the programmers task and Dijkstra's world?

GIGO (3, Insightful)

TheWoozle (984500) | about 6 years ago | (#25959947)

The glaring hole in Dijkstra's argument is that most software is built to automate what used to be manual processes, and they therefor have to mimic a human-centric process... which is inherently illogical, inefficient and rife with nonsense.

In the world outside the ivory tower, programmers do not have the freedom to create completely logical, functionally complete programs that can be reduced to a mathematical proof.

Next time your boss comes to you with an project to write an application, show him this paper and explain that what he's asking for is "medieval thinking" and see if you can then explain to him why you should keep your job if you don't want to do it.

There aren't entire majors... (1)

Renegade Iconoclast (1415775) | about 6 years ago | (#25960147)

based on Electrical Science, or Mechanical Science, are there?

So, why, then, are we forcing kids to take Computer Science, when what most of them really want is Software Engineering?

The only answer that I can come up with is that the people who come up with curricula are failed software engineers, and are trying to bring everyone else down with them. I interview kids with degrees that can't tell me what a heap is, or why I'd want to use a hashtable rather than a binary search tree, or vice-versa. Now, I know they had to learn that stuff, first year, but they haven't had to use any of it, since.

The ones who retained their first-year stuff often don't have the other engineering basics down, patterns like IOC, class factories, singletons, etc., are just vague ideas to them. Ask them to explain why you would use a class factory, instead of just calling new, sometime. That will bring an entertaining answer, 90% of the time.

Computer science doesn't concentrate on engineering skills, or it didn't when I was in school (UTexas in the 90's). I had to learn how to optimize various languages on my own. I had to learn various languages on my own. I have no need of calculus.

Now, I suppose there are jobs I could get, if I'd finished my degree, that require a lot of calculus. Physics engine designer, etc. There are plenty that don't, and don't require me to be able to design an operating system, either. Those things are niche specialties. What I know for sure is that 90% of the valuable information in my head was learned on my own time, or on the job, and that when I went to school, no classes covered much of this information.

Kids with degrees are notoriously goofy with multithreading (from our experience interviewing them), no longer a niche discipline, with multiple core machines commonplace today.

Ultimately, I find that a degree in CS is little to no positive indication of aptitude in Software Engineering. That's truly sad, and just plain dumb, besides. We're in trillions of dollars of debt. It's affecting our bottom line!

Self-confidence (3, Insightful)

dgenr8 (9462) | about 6 years ago | (#25960177)

All I have to do is read one paper like this to be reminded why I stayed out of academia. Ah the smugness, the hypocrisy, the great irony. A "radical novelty" this essay is not.

There are plenty of truths out there yet to be discovered. Unfortunately most academics lack the self-confidence to go looking for them and instead find clever new ways to twist ideas around.

Anthropomorphic Descriptions (2, Insightful)

SageinaRage (966293) | about 6 years ago | (#25960205)

The thing that confuses me the most about this paper is his hatred for using anthropomorphic metaphors to describe the functioning of a program. It confuses me partly because his examples of why it's bad don't seem to actually address his complaint, or anything like it. But also, because the more I think about it, they seem to fit very well.

Program components may not be living things, but they do run autonomously. They perform actions, frequently without any input from me. They seem to do things and interact with other components on their own - why not describe it as such? There's also the fact that he doesn't give any alternate way of describing what's going on inside a program.

Dijkstra is the typical head-up-arse CS crack (3, Insightful)

Qbertino (265505) | about 6 years ago | (#25960225)

There are some good quotes atributed to him, but one particular one that goes to show how very wrong even experts can be:

It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.

In my experience this is utter arrogant rubbish. Not being able to teach good programming to people who know Basic only stems from the inability of people like Dijkstra to teach. One of the reasons I usually stear clear of all to academic IT enviroments and programming languages. Like Ruby or Java.

I don't understand (2, Funny)

russotto (537200) | about 6 years ago | (#25960269)

I don't think I really understand what Dijkstra is getting at here. Can someone explain it to me with a car analogy?

If all we taught was theory... (0)

Anonymous Coward | about 6 years ago | (#25960311)

We wouldn't have actual computers, only theoretical ones.

Dijkstra's a genius, but, like almost anyone on the 99.999 percentile of the bell curve, is a mere crank when discussing anything outside his core area of expertise.

What a pompous windbag (3, Interesting)

mbone (558574) | about 6 years ago | (#25960343)

I am very glad I never had him as a professor.

By the way, I am a physicist, and IMHO all of the best physicists develop a physical intuition about their physics, and that is certainly true with those who deal with quantum mechanics. Listen to the recorded lectures of Richard Feynman, for example.

Sorta Kinda Yeah (3, Insightful)

Aaron_Pike (528044) | about 6 years ago | (#25960345)

He makes some good points, and I agree with a lot of Dijkstra's philosophies, there. I'm totally digging on the concept of radical novelty; I'm a big fan of teaching by cognitive dissonance.

However, I can't get behind the man's call to teach without compiling and running programs. Well, to be fair, I'd have no problems teaching a freshman college course that way, but I'm teaching teenagers. I want the students to be able to unleash what they have wrought (or at least see that they've created a program that works). That's the bait that hooks them deeper into the coolness that is computer science or software engineering or programming or pattern engineering or thinkyness or whatever you care to call it.

Back to the future (4, Interesting)

Bucc5062 (856482) | about 6 years ago | (#25960403)

As I read through his writings it brought me back to my time at Moravian College circa 1979. I just started taking CS classes and in that same year Dr Brown, Head of the CS Department pulled out all the IBM mainframe systems and installed a PDP 11/45. Gone were the COBOL courses replaced by c, RATFOR, PASCAL, Fortran et al. I loved it and hated it at the same time.

Like the presentation, Dr Brown taught us programming before we really saw the computer. His focus was not on Language, but on concept. As he so well put to us, once done with our intro class we could work anywhere in any language. I believed it then and found it to be a true statement. At the end of that intro class he took the last three weeks and taught sort algorithms. The catch was each sort was analyzed in a different language. I chuckle when I read posts of youngsters that say "I learned Java, or C++ in college". I learned Programming in college then went on to figure out what language suited my economic and intellectual needs.

Cruelty in Computer Science? I am grateful for that kind of cruelty to this day. Since college I have had to adjust my knowledge as times and needs change. I have had the pleasure of working with RPG, COBOL, Java, FORTRAN, and even the bastard child Visual Basic. Unlike some, I do not look down at any language for each has its benefits for the task. What I do dislike is working on code written by persons who thought that "Learn to Code Java in three Weeks" made them a programmer; that language X is the best and only language out there.

Dr. Dijkstra says "Universities should not be afraid to teach radical novelties". What things could be discovered if that concept was embraced again.

Load More Comments
Slashdot Login

Need an Account?

Forgot your password?