Slashdot Mirror


Twenty Years of Dijkstra's Cruelty

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.

727 comments

  1. The Text by eldavojohn · · Score: 5, Informative
    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.

    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 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.

    --
    My work here is dung.
    1. Re:The Text by Anonymous Coward · · Score: 0

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

    2. Re:The Text by dkleinsc · · Score: 3, Insightful

      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".

      --
      I am officially gone from /. Long live http://www.soylentnews.com/
    3. Re:The Text by wilder_card · · Score: 5, Funny

      What do you think this is, wikipedia?

    4. Re:The Text by Chode2235 · · Score: 1

      You throw out Turning's before Babbage?

      Did your CS program have no history requirements?

    5. Re:The Text by serviscope_minor · · Score: 1

      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?

      --
      SJW n. One who posts facts.
    6. Re:The Text by Packet+Pusher · · Score: 3, Informative

      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.

    7. Re:The Text by Anonymous Coward · · Score: 0

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

    8. Re:The Text by nschubach · · Score: 5, Funny

      What do you think this is, wikipedia?[citation needed]

      --
      Every time I start to have faith in humanity, I ruin it by driving to work between 7 and 8 am.
    9. Re:The Text by ei4anb · · Score: 0, Redundant

      citation required!

    10. Re:The Text by WhiplashII · · Score: 3, Interesting

      More than not being "great", he seems to be rather foolish...

      1) His main premise is that "software engineering" cannot exist because software cannot be proved correct, only proved wrong. Well, I got news for ya - rocket engineering is the same way. So is electronics. So are bridges! Or do you think that having the SRB on the shuttle burn through the main tank was by design?

      2) He goes further to say that foolish mortals (unlike himself) learn by analogy, and so can't handle the truth, etc. Then, hilariously, he goes on to say that the only true way to look at programming is as deriving a formula! Imagine that, a mathematician describing engineering as deriving a formula! No comfortable analogies here...

      3) Then he talks about how computers are "symbol manipulators". OK, but that is not very useful - computers are really devices that get things done that we want done. Some people want photons in pretty patterns on their screens. Some people want the control surfaces of aircraft actuated in ways that save time/money/lives. But a computer/program is useless without the output mechanism.

      Some of his conclusions are good - lines of code is an anti-metric. But in general, this paper was awful!

      --
      while (sig==sig) sig=!sig;
    11. Re:The Text by Anonymous Coward · · Score: 0

      Reading skills are not your forte, are they.

    12. Re:The Text by chunkyq · · Score: 5, Insightful

      Turning? TurNing?!
      Woe be to us, for all is certainly lost.

    13. Re:The Text by msuarezalvarez · · Score: 4, Funny

      But what a troll! Look around and see the pityful kind of trolls we are mostly left with now :(

    14. Re:The Text by JasterBobaMereel · · Score: 1

      Can I submit Charles Babbage who designed, built (and nearly finished) a computer before most people had even thought of them, and managed without even having a working computer to pre-empt most of the ideas of the following computer scientists by nearly 100 years .....

      --
      Puteulanus fenestra mortis
    15. Re:The Text by Anonymous Coward · · Score: 1, Insightful

      > Some people want photons in pretty patterns on
      > their screens.

      Symbols (photons). Symbols (petty patterns).

      > Some people want the control surfaces of
      > aircraft actuated in ways that save
      > time/money/lives

      Symbols (control surfaces). Symbols (actuated).
      Symbols (time). Symbols (money)

    16. Re:The Text by theaveng · · Score: 5, Insightful

      No.

      (1) His argument is that to discuss "software engineering" is as silly as to discuss "algebra engineering" or "formula engineering" in math courses. A program is simply a formula to be executed - nothing more - says the Computer Science professor.

      (2) Programs manipulate numbers. Mathematic formulae manipulate numbers. It's an entirely reasonable conclusion that he has reached that a program is merely a formula.

      (3) Putting pretty pictures on screen or manipulating airplane surfaces (my specialty) is still just formula execution.

      --
      FOX NEWS.com should be BANNED from television and internet. Have the Congress take it over and give us Truespeak.
    17. Re:The Text by 1729 · · Score: 4, Insightful

      More than not being "great", he seems to be rather foolish...

      1) His main premise is that "software engineering" cannot exist because software cannot be proved correct

      Actually, Dijkstra spent a lot of time showing how to prove a program's correctness. See his "A Discipline of Programming", for example.

    18. Re:The Text by Anonymous Coward · · Score: 0

      Would you accept that Turing is better thought of as a mathematician as opposed to a computer scientist?

    19. Re:The Text by Anonymous Coward · · Score: 0

      He also invented teh first Turing complete abstaract programming language. Though it was never implimented on a computing system.

    20. Re:The Text by MightyYar · · Score: 4, Funny

      My forte is made out of cushions from my mom's couch.

      --
      W..w..W - Willy Waterloo washes Warren Wiggins who is washing Waldo Woo.
    21. Re:The Text by bob.appleyard · · Score: 1

      Well it depends. You can objectively assess the greatness of someone, if you use "great" to mean "important and influential" rather than "big" or "really good." Of course making such an assessment is anything but straightforward.

      --
      How dare you be so modest!! You conceited bastard!!
    22. Re:The Text by WhiplashII · · Score: 2, Insightful

      I agree that is what he is saying - I disagree that it is a reasonable thing to say ;)

      A program is nothing without the computer it runs on. I could agree that if you were building programs for the purpose of knowledge (like he does, presumably), you are not an engineer - you are a mathematician. But that is not what computers are! Computers are a way to make something happen. By using generic computers running programs, we can more easily make complicated stuff happen.

      The airplane surface you actuate is engineered - but not by itself, it is engineered along with the software used to control it. The vast majority of software is engineered - engineers are trying to get a specific outcome, they are not trying to calculate something. Any calculation is incidental to the primary purpose.

      As a mathematician, he thinks the math is the most important part of it. Physics guys think the same - theory over substance in transistor design, for example. (CM polishing was a bad word for a long time!) Engineers just do what works - we don't care if it is perfect.

      People should not be studying abstract programming in college in order to learn applied engineering for industry. That's why the CS degree is so disparaged - it is great if you want to work in a university thinking up cool math, but it is not very good at building real stuff.

      --
      while (sig==sig) sig=!sig;
    23. Re:The Text by WhiplashII · · Score: 1

      Yes - odd really. That really was his premise in the paper, however. (Read the paper and show me I'm wrong!)

      --
      while (sig==sig) sig=!sig;
    24. Re:The Text by WhiplashII · · Score: 1

      I never said he was wrong - I just said it wasn't useful to think that way.

      --
      while (sig==sig) sig=!sig;
    25. Re:The Text by Chris+Burke · · Score: 1

      2) He goes further to say that foolish mortals (unlike himself) learn by analogy, and so can't handle the truth, etc. Then, hilariously, he goes on to say that the only true way to look at programming is as deriving a formula! Imagine that, a mathematician describing engineering as deriving a formula! No comfortable analogies here...

      Except that's exactly what programming is, writing a mathematical formula. Software is math. And that's not a metaphor; I'm being quite literal. Actually, let me be even more precise: Software is a language for describing math. A rock tossed in the air follows a parabolic path. h = h0 + vt - gt^2 describes a parabola. It's language, nothing by itself without something to interpret it. Software is exactly the same.

      Software merely describes math. A computer is a device that is capable of understanding that language, and performing the mathematical operations based on it. And is capable of doing the photon emission or control surface manipulation. Software can't do that. I/O, from a software standpoint, is nothing more than assigning values to or from a matrix from or to a variable. Computer hardware is what makes anything other than that happen. Just like the hand-written formula which uses as one of its values the current outdoor temperature; you personally getting up and checking the temperature and writing it down on the paper where you are doing your calculations does not change the formula you are following into something other than a formula; the formula on your paper didn't go read the thermometer. It's still just a mathematical manipulation, expressed in human-readable form. Software is the same, just machine-readable. And the act of programming is discovering the right formula to get the result that you want.

      --

      The enemies of Democracy are
    26. Re:The Text by hypnotik · · Score: 4, Insightful

      I think you are missing his point, perhaps intentionally.

      The vast majority of software is engineered - engineers are trying to get a specific outcome, they are not trying to calculate something.

      Computer programs, he argues, are nothing more than long proofs. Each function you write is equivalent to a predicate in logical calculus, or a function in mathematics.

      If you were only interested in outcome, you could write a program that multiplies two numbers together as a long series of "if" statements. But you'd most likely miss some possible values for inputs.

      However, if you were interested in it being correct for all possible inputs, you would use the mathematical operation * or use a loop to calculate the correct answer.

      I think that is the argument he is making and as a University professor, I tend to agree. I've seen some of my students test an array by using an if-statement for every single element of the array, where as a loop would have been infinitely more suitable.

      Only one should be deemed correct. But if you adapt the "engineering" and "outcome" point of view, both are correct.

      --
      (I was only an egg, but then I cracked)
    27. Re:The Text by wren337 · · Score: 1

      Don't dismiss his criticism of analogy. There is a valuable truth to learn here, that saying a thing is "like" another thing can make us blind to the differences. We are so adept at learning by association and extension that we can blind ourselves to the fact that nothing is truly like any other thing.

      I remember in school learning that an electron is a wave, and also a particle. It drove me crazy to think that it could be like two things that are so different. It took me years to realize - an electron is like an electron, and as much as you can learn by saying it's like a particle, you obscure the fact that it has no direct analogy, so stop trying to squeeze it into something you're more comfortable with and start learning about it directly.

    28. Re:The Text by sohp · · Score: 1

      Actually, Dijkstra spent a lot of time showing how to prove a program's correctness.

      He did. In fact, he spent more time proving the program correct than it took to write, test, run, debug, and fix, the program, and then the proof still has to be checked for correctness. I learned the Dijkstra techniques for proving code. Even something as painfully simple as proving a loop invariant holds and would terminate was mind-numbingly difficult and tedious, and still fails to be correct in the presence of concurrency. Somehow the program proof advocates lost sight of Gödel's incompleteness theorems. On top of being theoretically shaky, the technique is so wildly inefficient that the costs overwhelm the value almost before you get started. See the previous /. article, on how avoiding mistakes is a mistake.

    29. Re:The Text by orclevegam · · Score: 3, Insightful

      This reminds me of the problem that physicists have been trying to grapple with for a long time between the energy view of the world and the forces view. Some things are simpler to model as a set of interacting forces, others as a set of energy transformations. Of course both are equally correct models, but some things are easier to model using one or the other. Likewise taking the algorithm, versus outcome ways of modeling programming you see something similar, where a problem can be modeled with either one, but some problems are easier to model with one than the other.

      --
      Curiosity was framed, Ignorance killed the cat.
    30. Re:The Text by Shotgun · · Score: 1

      Except that the act of programming a computer DOES involve determining how the you will get up and read the thermometer. The math part is a major portion of software engineering. Other portions include:
      -deciding whether you will write code for calculating the temperature, or if you will hand it off to someone else (call a standard function or API)
      -deciding when or if the temperature reading given is to be believed.
      -how much precision do you have the processing capability to do, and how much precision is necessary.

      The paper goes on about how analogies let us down by being to shallow and should thus be avoided. But my reading reveals that the paper is full of analogies that are to shallow to be useful. The paper ignores the fact that humans need a bridge between what they know and what they don't know.

      Software is engineered. Most testing involves endpoints (just like analog object testing), because that DOES work for the most part. The term "bug" is used, because the root cause is not necessarily an error. We use analogies to teach, because that is the most effective way.

      In short, the paper is the the typical navel-gazing elitist geek thinking the whole world looks like his basement.

      --
      Aah, change is good. -- Rafiki
      Yeah, but it ain't easy. -- Simba
    31. Re:The Text by 1729 · · Score: 4, Interesting

      Actually, Dijkstra spent a lot of time showing how to prove a program's correctness.

      He did. In fact, he spent more time proving the program correct than it took to write, test, run, debug, and fix, the program, and then the proof still has to be checked for correctness. I learned the Dijkstra techniques for proving code. Even something as painfully simple as proving a loop invariant holds and would terminate was mind-numbingly difficult and tedious, and still fails to be correct in the presence of concurrency. Somehow the program proof advocates lost sight of Gödel's incompleteness theorems.

      I'm not an advocate of Dijkstra's approach. However, does the Incompleteness Theorem really come into play here? I can't think of any useful algorithm for which I wouldn't be able to formally describe and verify the pre- and post-conditions. Can you think of any naturally-arising examples of algorithms for which undecideability might be an issue?

    32. Re:The Text by colmore · · Score: 2, Insightful

      You're reducing his argument to a tautology in order to defend it. I don't think you want to do that.

      --
      In Capitalist America, bank robs you!
    33. Re:The Text by Shotgun · · Score: 1

      An important part of any analogy in teaching is to point out where the new differs from the analogy. The point of the analogy is to get your brain over to where the new stuff is. It is a bridge from old to new. The line is not "an electron is like a wave". The line is "an electron is like a wave, except..."

      --
      Aah, change is good. -- Rafiki
      Yeah, but it ain't easy. -- Simba
    34. Re:The Text by Reziac · · Score: 1

      Substitute "creative writing" or "painting" for "programming" throughout the paper, and note that he speaks generally, not merely as the concept relates to CS.

      What I got from the paper is that we need to stop being afraid of letting the students *be aware* that they may be learning something new. I don't think that's an unreasonable conclusion, tho I'd agree that he used far too many words to reach it.

      --
      ~REZ~ #43301. Who'd fake being me anyway?
    35. Re:The Text by raddan · · Score: 4, Interesting

      1. Computers are physical machines. The bounds of those machines are, in many cases, not fully understood, and in other cases, too complex for a single person to understand fully.

      2. True-- but you're forgetting about the execution domain. Dijkstra points out that computers are simply "symbolic manipulators", and this is certainly true, but that does not make them general-purpose symbolic manipulators in the same way that a human is. A programmer must go to great lengths to ensure that, i.e., the number 1/10 or pi is preserved throughout the calculation chain, and doing so is computationally expensive. Sometimes prohibitively so. This is where engineering comes in, because if there's one thing engineers are really good at, it's deciding when something is "good enough" or not.

      3. Sure, if you fully understand the phenomena. Are you telling me that your computational model fully accounts for turbulence?

      What Dijkstra does not seem to understand is that engineering does not eschew mathematics. Engineers use the same theoretical knowledge that mathematicians and physicists do— they use the same analytical tools. Engineering is, rather, a superset of those analytical tools. It includes some new tools in order to deal with the complexity of certain tasks that are above the ability of most normal humans to solve. It is remarkably good at this.

      Throwing out engineering because it will never solve the problem fully is like throwing the baby out with the bath water. Better solutions will emerge— functional programming, for instance, is very promising in many ways. I've read Dijkstra before, and I have great respect for him particularly because of his actual experience building large software systems. But this paper makes him sound like a bitter old man; maybe he didn't like the direction the field was moving.

    36. Re:The Text by WhiplashII · · Score: 1

      If you were only interested in outcome, you could write a program that multiplies two numbers together as a long series of "if" statements.

      Thank you for proving my point! The proper, best practices way to program a flight control system is a huge series of if statements. No loops are allowed, because the computer hardware has to be considered in the engineered design! If you put in loops, an infinite loop can occur - if you use a series of if statements, that is not possible.

      As a person that enjoys the theoretical, you miss the practical - these programs control hardware. The formula being correct does not matter - the hardware working correctly does. The program must take into consideration the hardware it will run on - that matters far more in most cases than the correctness of the algorithm.

      --
      while (sig==sig) sig=!sig;
    37. Re:The Text by Hythlodaeus · · Score: 1

      Dijkstra and similar contemporary theorists like to puff up their chests about how they are the "real" computer scientists because they can prove this and that. I'd like to see them "prove" that Google returns the most relevant search results, or that being on LinkedIn gets you a better job. What the theorists are doing is useful, but neither the heart nor the cutting edge of computer science. The real advances come from lateral thinking and imagination, with the formulas coming in behind and filling in the details.

      --
      For great justice.
    38. Re:The Text by theaveng · · Score: 1

      >>>A program is nothing without the computer it runs on.

      Disagree. (And this is the fundamental point where I agree with the Austin professor, and you disagree with him.) A program does not need a computer. It could also be executed by a human, albeit at a much slower pace. A program is just a mathematical formula.

      With today's 3000 megahertz machines we've lost touch with that basic fact, but on my old Commodore 64 which operated much slower and with only a few instructions, it was much easier to grasp. What my C=64 does, I can do.

      It's isn't magic. It's math. Even the movement of airplane control surfaces is a series of equations.

      --
      FOX NEWS.com should be BANNED from television and internet. Have the Congress take it over and give us Truespeak.
    39. Re:The Text by ArsonSmith · · Score: 1

      I'd also like to know how many programmers outside of research actually program math. I think there is a lot more programming how to get the temperature, and how to display it in a meaningful way, than there is doing anything with it.

      --
      Paying taxes to buy civilization is like paying a hooker to buy love.
    40. Re:The Text by WhiplashII · · Score: 1

      That is precisely what a theoretical guy says - but I'm an electrical engineer, so I have designed CPUs... a program is a set of states you want the hardware to go through, not a formula. Look at assembly language - it is a much further stretch to call it a formula than to call a hardware state lists. And when designing it, we definitely treat it as a hardware state list.

      So is it not programming to write the software for a machine that is not turing complete? How about FPGA - where software and hardware are truely blended? What about DSPs, where branching is impossible?

      I think engineering covers a lot more of software development than "formulating" does.

      --
      while (sig==sig) sig=!sig;
    41. Re:The Text by Chris+Burke · · Score: 1

      -deciding whether you will write code for calculating the temperature, or if you will hand it off to someone else (call a standard function or API)
      -deciding when or if the temperature reading given is to be believed.
      -how much precision do you have the processing capability to do, and how much precision is necessary.

      Which are essentially the same as deriving the same formula to be done by hand. It's the same.

      --

      The enemies of Democracy are
    42. Re:The Text by Anonymous Coward · · Score: 2, Interesting

      Except that there is great doubt regarding Ada's abilities and achievements.

      See Doron Swade's The Difference Engine for more detail.

      And the original poster did say "greatest computer scientist'. Even if you grant Ada what the legends claim, she would still be outclassed by Turing - as would we all.

    43. Re:The Text by williamhb · · Score: 1

      (2) Programs manipulate numbers. Mathematic formulae manipulate numbers. It's an entirely reasonable conclusion that he has reached that a program is merely a formula.

      Pedantically, no they don't. They manipulate properties (usually potentials) of solid state devices. For convenience's sake, the mathematically minded consider the properties of the solid state devices to be a binary representation of a number. Note: not a number itself in the abstract number theory sense of the successor function, but a particular representation of a number. However, there is no special requirement for this to be the analogy we use. To use a trivial example: stating that the character 'A' can be represented by the number 65 (or whatever the modern unicode equivalent is) is a mathematical bias; they do share the same representation in memory under ASCII, and there are CPU operations that can act on either -- but it would be just as true to say that "the number 65 can be represented by the character 'A'". That we say the potential patterns are representations of numbers is entirely a matter of human interpretation. Modern software engineering has started to abstract away from this number-prejudice, for instance references are less frequently described as "a representation of a look-up number" and are increasingly treated just an abstraction of a unique reference to an item (we skip the artificial intermediary of calling the reference a 'number').

    44. Re:The Text by theturtlemoves · · Score: 3, Funny

      My forte is made out of cushions from my mom's couch.

      You mean your mom's couche, I think.

      --
      Empires grow and crumble, and the Turtle Moves. Gods come and go, and still the Turtle Moves. The Turtle Moves.
    45. Re:The Text by jgrahn · · Score: 1

      Actually, Dijkstra spent a lot of time showing how to prove a program's correctness.

      He did. In fact, he spent more time proving the program correct than it took to write, test, run, debug, and fix, the program, and then the proof still has to be checked for correctness. I learned the Dijkstra techniques for proving code. Even something as painfully simple as proving a loop invariant holds and would terminate was mind-numbingly difficult and tedious,

      I disagree. That stuff has been really useful to me in my daily work. Not formalized, but as a way to look at code. I can usually look at a loop for a while (no pun intended) and see that it is correct, or for which input states it's not. Others throw something together which happens to pass a few sloppy unit tests, then forget about it and move on.

      and still fails to be correct in the presence of concurrency.

      If you choose to ignore concurrency even though you know there is concurrency, that's your fault. Not some dead Dutch guy's.

    46. Re:The Text by El+Cabri · · Score: 1

      "A Discipline of Programming" is more specifically, about how to write programs that are correct by construction, than it is about how to prove that already written programs are correct.

      IMHO what I understand of 30 years of history of the software industry, and my experiences of formal methods and programming language theory in the research world on the one hand, and real-world professional software development on the other hand, validate everything that's in this book.

    47. Re:The Text by Chris+Burke · · Score: 1

      That is precisely what a theoretical guy says - but I'm an electrical engineer, so I have designed CPUs... a program is a set of states you want the hardware to go through, not a formula. Look at assembly language - it is a much further stretch to call it a formula than to call a hardware state lists. And when designing it, we definitely treat it as a hardware state list.

      I design CPUs... and finite state machines were mathematical constructs long before any electrical computer existed. "A set of states you want to go through", without the word "hardware", is a formula, just an iterative one. That's still math.

      So is it not programming to write the software for a machine that is not turing complete? How about FPGA - where software and hardware are truely blended? What about DSPs, where branching is impossible?

      Why would Turing Completeness matter? There are mathematical systems where you cannot compute everything that is computable, so what does that have to do with programs being math or not?

      FPGAs aren't really any different. You've got a physical device that can read and interpret a mathematical description and turn on or off physical gates based on that langauge. What, you think what I'm saying doesn't apply equally well to HDLs? The only difference is that in most cases, the HDL is not just a language for describing the mathematical operations, it's a blueprint for building a physical device. The physical device isn't a mathematical language anymore. But if you're running your HDL in a software simulator, or simply using it to program the gates of an already existent physical device (FPGA), it's the same as a program.

      I think engineering covers a lot more of software development than "formulating" does.

      Other than there being no difference, sure why not. Call it whatever you want.

      --

      The enemies of Democracy are
    48. Re:The Text by Eli+Gottlieb · · Score: 1

      Algorithms that don't terminate?

    49. Re:The Text by MightyYar · · Score: 3, Funny

      Not that I come up from the basement very often, but I've never seen my mom bake bread :)

      --
      W..w..W - Willy Waterloo washes Warren Wiggins who is washing Waldo Woo.
    50. Re:The Text by Darinbob · · Score: 1

      That's why the CS degree is so disparaged - it is great if you want to work in a university thinking up cool math, but it is not very good at building real stuff.

      You need both the applied science and the technical science. The "software engineers" without a fundamental computer science background are not so good at building real stuff either. I've seen them trying to solve old and well known problems with naive solutions, or create non-scalable solutions, or repeat old mistakes. All that theory is very useful.

      One problem is that "software engineering" seems to be a misnomer. It's more about managing engineers and managing software complexity than about engineering or science.

    51. Re:The Text by Potor · · Score: 3, Funny

      What about Beowulf? I mean, that's over a millennium ago, and he certainly left his mark on computer scientists.

    52. Re:The Text by hypnotik · · Score: 1

      I'm a bit confused here... are you just taking random statements and claiming they prove your point because they sound similar?

      I fail to see how my statement does that. Are you saying that because of possibility of errors in the control program, the proper best practices way is a huge series of if-statements?

      Or are you saying that because of the possibility of errors in the hardware, the control program should be written as a series of if-statements?

      In either of the above cases, perhaps if more engineers (software or computer) adopted Dijkstra's point of view, there would be less errors?

      Furthermore does this "computer" ever use a cylical control structure to do anything?

      --
      (I was only an egg, but then I cracked)
    53. Re:The Text by tigre · · Score: 1

      Except that from an engineering standpoint only one is correct, but which one could be determined by real-world characteristics. One of those circumstances is the need to maintain code over time, and a series of if-statements is typically much harder to maintain than a loop. Another circumstance is the time constraints for building the program, which would again generally favor the loop. Someone else has already mentioned a case in which they think the loop could be the incorrect choice.

      As an engineer, I have to modify or discard plenty of Theoretically Correct constructs to accommodate all manner of constraints. I love a good proof with airtight logic, but the real world does not afford us the opportunity to construct those when there are other, more pressing concerns.

    54. Re:The Text by Anonymous Coward · · Score: 0

      If you put in loops, an infinite loop can occur - if you use a series of if statements, that is not possible.

      So, you've either solved the halting problem, or do not allow any sort of flow control? Me thinks someone is not clear on the concept.

    55. Re:The Text by fm6 · · Score: 1

      In point of fact, there were no probably no individual digital computer owners (analog computers are another matter) before the cost of a computer fell below, say, an average person's annual income. Probably the first computer to have a lot of user-owners was the Sol 20, which went for $1K in kit form — about $3800 in today's money.

      Also, sneering at the lack of hacking expertise of somebody like Dijkstra ignores the difference between computer science and computer engineering. Sort of like sneering at a chemist who doesn't know how to brew beer.

      As for Turing: I think too many people contributed to the birth of computing for any one of them to claim parenthood. You could make a case for AT being the father of software, since he was the first computer scientist to really consider programming to be more than a minor adjunct to the hardware. Indeed, if you consider Turing Machine code to be software, Turing was doing software long before there were any computers to do it on!

    56. Re:The Text by Intron · · Score: 1

      Thank you for proving my point! The proper, best practices way to program a flight control system is a huge series of if statements. No loops are allowed, because the computer hardware has to be considered in the engineered design! If you put in loops, an infinite loop can occur - if you use a series of if statements, that is not possible.

      That's absurd. If you don't understand how to prove a loop will exit then you should not be working on critical system software. I've seen vital logic designs (vital == human lives depend on correct operation) and there was no restriction on use of loops. There was an emphasis on proving correct operation.

      --
      Intron: the portion of DNA which expresses nothing useful.
    57. Re:The Text by pngwen · · Score: 1

      No, Computers are not something that "Do what we need", computers are deterministic finite automatons. They have a finite (though very large from a practical standpoint) set of states they can move through. All a programmer is doing is creating delta functions which move the automaton from one state to another. Worse yet, in modern digital computers, we encode the delta function into the machine's set of states (translation, programs are stored in memory). This gives rise to the notion that there is also a finite, though practically large, set of programs which can be written on/for any physical digital computer.

      The idea of "usefulness" or "getting things done" is what we as users extrapolate from various visualization of these states. The computer itself is only changing its configuration. We establish meaning and function from that based on the context that we provide. So the real crux of this statement is we, as humans, use computers to perform useful tasks. Computers no more compute than screwdrives actually drive screws. It requires some interaction with a human for either to perform its function.

      --
      I am the penguin that codes in the night.
    58. Re:The Text by Metasquares · · Score: 2, Insightful

      Just because you can abstract something to the degree that it is the same as anything else in the universe does not mean it is proper to do so. It would be like programming in an OOP language by upcasting everything to Object before working with it.

      I admire some of Dijkstra's contributions. Certainly his shortest-path algorithm was a great accomplishment. But he was very opinionated, and some of his opinions aren't necessarily the best strategies for others to employ in their own work.

    59. Re:The Text by 1729 · · Score: 1

      Algorithms that don't terminate?

      Do you mean some event-driven code that has an infinite loop underlying it, or are you referring to the halting problem? In the former case, establishing loop invariants and formal pre- and post-conditions for subroutines should suffice. For the latter: if there's a question of whether or not an algorithm will terminate, I suspect there's something wrong with the program. (Randomized algorithms are perhaps an exception to this statement, since you could have an algorithm that terminates with probability 1, yet could still (theoretically) loop forever.)

    60. Re:The Text by WhiplashII · · Score: 3, Insightful

      When designing avionics software, the halting problem is a real problem ;-}

      So to get around that, you write all software as a (very long) series of if statements in an interrupt routine. So what happens is the interrupt fires, and the list of instructions starts to execute... eventually, the interrupt fires again, restarting the process.

      The reason to do this: By putting instructions higher in the list, those instructions are run first - so you are able to put the "don't kill us" calculations before the "avoid turbulence" calculations. As an example of this saving lives, the computer in the Apollo 11 moon lander ran into trouble just a few feet above the lunar surface - pretty much a worst case scenario. Because the computer was designed like this, although they lost some functions they did not lose the ability to land the spacecraft - and Niel Armstrong made history as the first man to walk on the moon rather than die on it.

      In many software engineering applications, you must consider the failure modes of the hardware you are using - not the theory of programming formulas. Software that is proven correct but then doesn't run properly is useless.

      The reason I bring this up is that you assumed that using a gazillion if statements is a bad approach, because you are optimizing expression efficiency and treating the program as a formula. This is not the proper response in many cases, and an engineer would know that - that's why you are proving my point.

      --
      while (sig==sig) sig=!sig;
    61. Re:The Text by WhiplashII · · Score: 1

      OK, and I don't want you working on avionics, thanks!

      There are several ways to deal with the problems presented - apparently you are not intelligent enough to judge that the industry-wide best practices for avionics software engineering are good.

      Learn what a watchdog timer is, and why it is a bad idea for avionics, and why loops in avionics controls are bad before telling me that I "don't understand how to prove a loop will exit."

      (Hint: Avionics often flies above the atmosphere - variables do not necessarily keep the values you given them)

      --
      while (sig==sig) sig=!sig;
    62. Re:The Text by WhiplashII · · Score: 1

      A program is nothing without the computer it runs on.

      Disagree.

      Well, OK... but now you are arguing through redefinition. You are essentially saying that formulas (math stuff done by humans) is the same as programs (math stuff done by computers). And I can prove it because I can take the instructions for the computer, and execute them myself.

      Obviously true, but pointless - I mean, we did design the computers after all...

      Explain how this is different than describing an airplanes wing with math? We call that engineering, not because magic is involved, but because we are using formulas to solve problems.

      (And yes, we can work the number for airflow over a wing by hand also - but that does not make aerospace engineering into mathematics.)

      --
      while (sig==sig) sig=!sig;
    63. Re:The Text by WhiplashII · · Score: 1

      FPGAs aren't really any different.

      An FPGA reads a binary stream of data, and "wires" the interconnect based on that. I think it is a bit of a stretch to call that "interpreting a mathematical description."

      But I suppose that I will never convince you. So, yes, call it whatever you want.

      --
      while (sig==sig) sig=!sig;
    64. Re:The Text by WhiplashII · · Score: 1

      You are totally correct, but give no insight.

      You could say the same for practically every device built by man - but it wouldn't make software engineers into mathematicians any more than it would make aerospace engineers into mathematicians.

      After all, in the car and out of the car are simply mathematical states.

      And anyway, 2^800000 is an amazingly large number of possible programs - and that is only using 100MB. It might as well be an infinite set - no one outside of a mathematics department will ever know. Reminds me of that story - an engineer and a mathematician are told that they can go get a cake 2 steps away, but each step they take must be only half the distance of the first. The mathematician doesn't try, saying that only a fool would attempt such a thing. The engineer takes 3 steps, says "that's close enough" and eats the cake ;-)

      --
      while (sig==sig) sig=!sig;
    65. Re:The Text by 1729 · · Score: 1

      Dijkstra and similar contemporary theorists like to puff up their chests about how they are the "real" computer scientists because they can prove this and that. I'd like to see them "prove" that Google returns the most relevant search results, or that being on LinkedIn gets you a better job. What the theorists are doing is useful, but neither the heart nor the cutting edge of computer science. The real advances come from lateral thinking and imagination, with the formulas coming in behind and filling in the details.

      You really ought to learn more about Dijkstra's work before you make these claims. Dijkstra was absolutely on the cutting edge of computer science. His discovery of the semaphore construct, for example, was groundbreaking. Then there's his work on ALGOL 60, THE, his shortest-path algorithm . . .

    66. Re:The Text by COMON$ · · Score: 1

      You missed a lot of the points because you are the product of the individuals he warns about. I cannot explain it clearer than he did so if you didn't understand it then it is your loss. Suffice to say, since you don't understand his premise and probably lack the ability to do so because of your upbringing, your three counterpoints are moot. I postulate you are modded insightful because what you wrote sounds intelligent, but is simply misinformed.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    67. Re:The Text by COMON$ · · Score: 1

      Well put, better than my response. I don't have mod points so kudos instead.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    68. Re:The Text by WhiplashII · · Score: 1

      And yet somehow I have managed to create hundreds of millions of dollars of value in the software systems I have designed, and he hasn't.

      Isn't that odd?

      --
      while (sig==sig) sig=!sig;
    69. Re:The Text by WhiplashII · · Score: 1

      Oh, and by the way - I was self taught.

      Your inability to explain yourself, and blaming my "upbringing" has really explained it all. To everyone.

      --
      while (sig==sig) sig=!sig;
    70. Re:The Text by COMON$ · · Score: 1
      People should not be studying abstract programming in college in order to learn applied engineering for industry. That's why the CS degree is so disparaged - it is great if you want to work in a university thinking up cool math, but it is not very good at building real stuff.

      I beg to differ, I am an Network Engineer. A rather successful one, I have excelled past many co-workers in every job I have been at. I have led several forums in answering various issues networking related that individuals come across. I was taught in a manner similar to what Dijkstra proposes. It has been immeasurably helpful in every aspect of my life. Most students dont remember what they learned in college, at least not the details. However, being taught in this manner allows you to move your knowledge set to envelope tools rather than just know how a tool works. I don't care if I am on a Windows network, a Unix network, or one made out of toast. Because I was taught to see things from an abstract view. This is why while other people get stuck with "this is how dad did it" mentalities, my networks progress, continue to work smoothly,and allow people to function correctly.

      There is a reason people are so bitchy about Linux vs Windows and IPv4 vs IPv6. because people cant see bigger pictures and only care about these constructs they have made up. Rather than viewing things formulaic. Which is too bad because I keep having to fix peoples dumb ass setups. It is too bad also because many people spend their lives bitching about how systems and inventions don't work correctly. It is because they are in such a damn hurry they create objects they don't understand and their formula don't work. But they will never understand this and spend their lives wallowing in frustration because they never were taught to look at the computational world correctly.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    71. Re:The Text by WhiplashII · · Score: 1

      Well, I am not arguing about his teaching techniques - the paper did not seem to go into any detail about that, except to say that analogies are bad.

      What I am arguing about (mainly) is his statement that there is no such thing as software engineering - indeed, I am sure he would similarly say that there is no such thing as network engineering. That is just silly.

      I taught myself to think, so I can't really compare to his methods as you describe it. I do know that the way I think is very different from most people, but beyond that I don't think I could help you - but to be honest, people who talk about how they can see from an "abstract view" tend to 1) be good, but not great, and 2) very stuck up about themselves.

      Of course, I don't know you - you are probably just trying to explain a thought process, something very difficult to do in the best of circumstances.

      --
      while (sig==sig) sig=!sig;
    72. Re:The Text by andyh-rayleigh · · Score: 1

      Unfortunately, succeeding in the very difficult task of proving that a program correctly meets its specification just pushes the whole problem back to proving that the specification itself is correct.
      In the "real world" the latter is rarely (never?) the case.
      I did put this point to Prof Dijkstra at one of his lectures but never got a satisfactory answer.

    73. Re:The Text by COMON$ · · Score: 1
      I didn't say you were unintelligent. But rather you were mistaken because you didn't understand his conclusions due to your different way of thinking. A person can be substantially successful not following the advice of the paper. Once again you came to the wrong conclusion. Simply the article is an indictment of the current method people use to teach. Just because you were self taught doesn't mean you are better or worse off, rather that you found a way to do what you wanted and in a successful manner evidently. I don't believe you agree that every self taught individual is also rational and well behaved. I know lots of self taught people who have some of the most horrid misconceptions ever. Which is why I find the story in I,Robot about the robots worshiping their God entertaining.

      Try reading some of Feynman's books someday, insightful reading and entertaining.

      In conclusion I meant no slight to your intelligence, rather that because of the way you see the world and have taught yourself is probably the reason you came to the wrong conclusion of what he was stating.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    74. Re:The Text by COMON$ · · Score: 1

      Of course, I don't know you - you are probably just trying to explain a thought process, something very difficult to do in the best of circumstances.

      Thank you for saying that, don't hear that often on /.

      Yes, people who can see things in the sense of constructs tend to be the weirdos because everyone else is to busy flaunting their arrogant knowledge of the details of everything. Being in IT you know these people, they are everywhere. The guy who thinks in constructs usually tends to be the quiet guy/girl in the room waiting until the situation is laid out then responds with a question to further their knowledge of the situation. I bet you are good at what you do because you don't think in terms of .NET only or Windows only. But rather you see a situation and consider 15 different tools to accomplish the job. This is what he is getting at in the paper. He is saying rather than telling someone how to use a tool. Teach them how to see the solution. Working in this manner you can use a variety of variables and constructs to come up with a solution. Rather than just being a 1 hit wonder with 1 language or 1 OS.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    75. Re:The Text by Intron · · Score: 1

      > OK, and I don't want you working on avionics, thanks!
      >
      > There are several ways to deal with the problems presented

      what problems are you talking about?

      > - apparently you are not intelligent enough to judge that the industry-wide best
      > practices for avionics software engineering are good.

      ad hominem attack

      > Learn what a watchdog timer is,

      I have

      > and why it is a bad idea for avionics,

      No clue - It's used in vital logic for failover between redundant controllers.
      I bet it is used in avionics systems for the same purpose.

      > and why loops in avionics controls are bad

      No clue

      > before telling me that I "don't understand how to prove a loop will exit."

      Saying that one type of control statement is good and another one is bad
      is absurd: if and loop are both just conditional branch statements.

      > (Hint: Avionics often flies above the atmosphere - variables do not necessarily
      > keep the values you given them)

      What does the one have to do with the other?
      Do you believe that flying above the atmosphere changes your variables?

      I think you are just spouting random gibberish.

      --
      Intron: the portion of DNA which expresses nothing useful.
    76. Re:The Text by Anonymous Coward · · Score: 0

      That is precisely what a theoretical guy says - but I'm an electrical engineer, so I have designed CPUs... a program is a set of states you want the hardware to go through, not a formula. Look at assembly language - it is a much further stretch to call it a formula than to call a hardware state lists. And when designing it, we definitely treat it as a hardware state list.

      I think you fundamentally miss the point.
      The Engineering/Not Engineering dichotomy represented here is not about whether then engineering you do to build a control system for a plane (which includes software) is Engineering. It is about the production of a program, in general - not specific - terms.
      His argument is that programming is essentially mathematics. Engineers of various disciplines use mathematics in engineering endeavours all the time. Usually even. However the act of applying mathematics is not, by itself, engineering, and cannot be approached that way in a general sense.
      To extend the argument, engineers use programming (argued in this case as a subset of mathematics) in engineering endeavours all the time. This application of programming is Engineering, but the act of programming itself is not Engineering. Just like calculus...
      In general, as its own discipline, mathematics is theoretically grounded and formally rigorous. Djikstra's argument is that programming, as its own discipline (and in this context - as taught to CS students) is also correctly formally rigorous.
      The argument is not that "Engineering with Software" does not exist, any more than he argues that "Engineering with Mathematics" does not exist. The argument is that Mathematics/Programming by themselves are their own theoretical disciplines which follow their own framework[s].

      Programming languages are just that - languages.
      They are limited languages (symbol-sets) used to define algorithms and operations - which are essentially mathematical functions and operations. A human with a sufficient grasp of the symbol-set and instructions could carry out the appropriate symbol-manipulation and provide the correct outputs. A program in any of those languages is not a hardware-state list, because as long as the interpreter functions correctly, the underlying hardware is irrelevant - this is the only thing that allows virtualization to work at all.

      So is it not programming to write the software for a machine that is not turing complete? How about FPGA - where software and hardware are truely blended? What about DSPs, where branching is impossible?

      A program follows the formal definition of a function - Turing complete or not.
      It takes one or more inputs/variables,
      based on those inputs/variables it outputs predictable repeatable values.

      In FPGA hardare and software are NOT truly blended. A correct interpreter could still accept the defined language and produce the correct results (e.g. an emulator) and DSPs are no less mathematical - they are just 'simpler' mathematical functions, with a program implemented in hardware. The same instruction-set could be supplied to any correct interpreter for those instructions and return the same result.

      I think engineering covers a lot more of software development than "formulating" does.

      That may possibly be true. Also, most use of mathematics is probably closer to engineering than formal mathematical theory. That does not decrease the importance of teaching Mathematics majors the formal theoretical underpinnings of their field any more than it decreases the value of teaching Computer Science majors the theoretical underpinnings of theirs. Believe it or not this paper is not meant to apply to every person who ever wrote a line of code. It's a paper about the education of CS majors.
      The argument about Software Engineering being non-existent is more about the argument that programs are mathematical formulae (see above) and not real-world items than it is about the work that engineers do with programming.

    77. Re:The Text by COMON$ · · Score: 1

      Sorry had to say it, considering that he is one of the fathers of modern computing, his revenue generated far exceeds your own. Consider that the languages you use were all created off of many of his algorithm contributions....He just doesn't get credited except by academics.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    78. Re:The Text by benthurston27 · · Score: 1

      It says in the wikipedia entry on algorithm that there isn't even really an agreed upon precise definition of the word algorithm. what axioms are behind the algorithm or there being propositions that can neither be proven or dis-proven with those axioms? I think most probably either I or the parent is confused about the incompleteness theorem as it applies to the algorithm. maybe me lol

    79. Re:The Text by WhiplashII · · Score: 3, Informative

      what problems are you talking about?

      Achieving higher than normal reliability.

      I have... No clue - It's used in vital logic for failover between redundant controllers.

      OK, perhaps I should have mentioned "in the context of avionics systems." A watchdog timer is a timer that resets a CPU system if a timeout is reached. It is a way of attempting to achieve reliability in the presence of less reliable hardware.

      No clue

      Obviously ;)

      Do you believe that flying above the atmosphere changes your variables?

      Do you believe it doesn't? The atmosphere stops gamma rays from hitting your equipment. These gamma rays change the value of variables (as in, the gamma ray flips the DFF circuit to the opposite value in your CPU). That means you cannot rely on variables to make sure your loop exits. Therefor loops are bad.

      I think you are just spouting random gibberish.

      I have a multimillion dollar budget that says I am not - how about you?

      --
      while (sig==sig) sig=!sig;
    80. Re:The Text by WhiplashII · · Score: 1

      considering that he is one of the fathers of modern computing, his revenue generated far exceeds your own

      Nah, he's just older ;} I am creating new industries as well - give em time!

      --
      while (sig==sig) sig=!sig;
    81. Re:The Text by COMON$ · · Score: 1

      Here ya go you are running into a classic example of an individual who was taught that abc is the way to go. Rather than parsing the situation as a set of problems and a resolution with those variables in context. In this scenario you are agreeing with Dijkstra in that you need to understand the problem before you can create a solution. Rather than assuming that do-while is the best way to go, as an abstract approach you think...'I need a method that behaves like this because of that', and thus you have started writing an algorithm in your head.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    82. Re:The Text by Anonymous Coward · · Score: 0

      I wish such things could be taught!

    83. Re:The Text by COMON$ · · Score: 1

      LOL, more power to ya buddy ;) However, considering that the tech you are using still uses his tech therefore anything you create will just go into his pool of revenue generated.... ;) You could write your own language following your own algorithms but that is waaay to much work.

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    84. Re:The Text by retchdog · · Score: 1

      Another genius of computer science, Knuth, put it well: "Premature optimization is the root of all evil." I think applying this to human beings is a good principle to live by.

      Look at it from the luser's (ok, neophyte's) point of view. For loops require effort X to write; if statements take X/10. If the array is smaller than 10, then sure why not use if statements? Well, if you don't ever get the "difficult coefficient" on for loops down, you'll never be any good. But better to churn out shitty if-statement code, than nothing, if the rest works.

      It's happening to me right now; I have an optimization problem which came up unexpectedly (the space is just a little too rough for my naive stochastic sampler, and I have to seed it at the optimum). I have to be done by tomorrow morning. The right solution is dynamic programming, but it'd take too much effort. The shittiest solution is prepackaged non-gradient simplex-method, which is just too slow. So what I'm going to do with my skillset is re-derive the problem to be soluble with iterative re-weighted least squares, and throw the quadratic optimizer at it a few times. A nice compromise.

      What is the difference between my situation and the if/for guy's? Absolutely nothing in a way - settling for a "less than perfect" solution is a (learnable!) skill in-and-of-itself; orthogonal and complementary to whatever subject-specific mastery and expertise you may (or may not) possess.

      Now to go derive my reweighting scheme. Yipes!

      --
      "They were pure niggers." – Noam Chomsky
    85. Re:The Text by WhiplashII · · Score: 1

      Nah, I'm getting tired of programs - I'm building rockets now. Wave of the future, man, wave of the future!

      --
      while (sig==sig) sig=!sig;
    86. Re:The Text by Mozk · · Score: 1

      Well since the original argument was about who was the greatest computer scientist to never own a computer, I would think that Konrad Zuse's ownership of a computer would render him ineligible to receive that title.

      --
      No existe.
    87. Re:The Text by Intron · · Score: 2, Insightful

      OK, perhaps I should have mentioned "in the context of avionics systems." A watchdog timer is a timer that resets a CPU system if a timeout is reached. It is a way of attempting to achieve reliability in the presence of less reliable hardware.

      A watchdog timer is a timer that is periodically reset. If it times out the system does whatever it is designed to do in that case, which is not necessarily to reset the CPU. The use in high-availability systems is usually to transfer control to a standby when the primary system has failed.

      Do you believe it doesn't? The atmosphere stops gamma rays from hitting your equipment. These gamma rays change the value of variables (as in, the gamma ray flips the DFF circuit to the opposite value in your CPU). That means you cannot rely on variables to make sure your loop exits. Therefor loops are bad.

      Hogwash. If you can't depend on variables or CPU registers, then you can't depend on your if-statements branching to the correct location. Your example makes no sense.

      I have a multimillion dollar budget that says I am not - how about you?

      The CEO of AIG has a bigger budget than you, so is he even more correct?

      --
      Intron: the portion of DNA which expresses nothing useful.
    88. Re:The Text by WhiplashII · · Score: 2, Informative

      then you can't depend on your if-statements branching to the correct location

      You're right. You can't.

      And so you have to develop code that will work, as often as possible, as close as correctly as possible, even though your hardware will not function per design. If statements fair better than loops in these situations - I have discussed why in moderate details elsewhere in this thread.

      --
      while (sig==sig) sig=!sig;
    89. Re:The Text by WhiplashII · · Score: 1

      The CEO of AIG does not have a multimillion dollar avionics design budget.

      I probably know a great deal more about avionics systems than him.

      --
      while (sig==sig) sig=!sig;
    90. Re:The Text by psb777 · · Score: 1

      Turing proved: All computers are, at best, equivalent to the Turing Machine. Essentially: Other than the amount of RAM and the speed of execution all computers are equivalent. So the program is all, and the particular computer irrelevant.

      --
      Paul Beardsell
    91. Re:The Text by PCM2 · · Score: 1

      Computer programs, he argues, are nothing more than long proofs. Each function you write is equivalent to a predicate in logical calculus, or a function in mathematics ... I think that is the argument he is making and as a University professor, I tend to agree. I've seen some of my students test an array by using an if-statement for every single element of the array, where as a loop would have been infinitely more suitable.

      I believe I speak for several generations of self-taught programmers when I say that lack of understanding of lambda calculus is not what causes this behavior. I leave it to keener minds to come up with an appropriate adjective that explains it.

      --
      Breakfast served all day!
    92. Re:The Text by AK+Marc · · Score: 1

      Computer programs, he argues, are nothing more than long proofs.

      Given X, the answer is Y. Yes, that's how it goes. But then, so is everything else a proof. Almost everything could be described that way. Most engineering comes down to some prep work, followed by a proof. "Will this bridge hold?" "Yes/No, and how did you come to that conclusion" And that's all an engineer building a bridge does. Sure, they have to do a little to come up with the design to examine, but it is all proof after that.

      But to do it well, it is an art, not a math. It isn't "make it do this." It is "do this using the least amount of resources practical and present it in a pleasing and easy to use manner."

    93. Re:The Text by LihTox · · Score: 1

      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.

      No doubt the submitter is a Un*x partisan: "he didn't own a REAL computer, just a Mac" sort of thing. :)

    94. Re:The Text by Anonymous Coward · · Score: 1, Interesting

      A watchdog timer is a timer that resets a CPU system if a timeout is reached. It is a way of attempting to achieve reliability in the presence of less reliable hardware.

      Watchdog timers are routinely used as a defense against the possibility of software design errors. A watchdog is a simple way to guarantee that if the system crashes for ANY reason, your vital hard realtime control loops get restarted. If you engineer the system carefully, it won't even skip one single sense-compute-response cycle.

      Also:

      Do you believe it doesn't? The atmosphere stops gamma rays from hitting your equipment. These gamma rays change the value of variables (as in, the gamma ray flips the DFF circuit to the opposite value in your CPU). That means you cannot rely on variables to make sure your loop exits. Therefor loops are bad.

      1. You basically can't build CPUs without protection against SEUs these days. At current process nodes they don't even work at sea level if they don't have ECC protection on all the caches, registers, and even (or so I've heard) datapath circuits.

      2. If you are designing a control system where you must run your control loop at a given frequency or Something Bad Happens, leaving for loops out doesn't get you off the SEU hook. Yes, SEUs could corrupt a loop index variable, but they can just as easily crash the CPU itself (that is, corrupt its internal state to something inconsistent such that it ceases making forward progress executing the user program, or worse, flails around doing strange things). If you're concerned about SEUs interrupting your control function, YOU MUST INCLUDE A RAD-HARDENED HARDWARE WATCHDOG. No ifs, ands, or buts.

      3. Simple defensive programming techniques can reduce the probability of unintended infinite loops to nearly zero.

      I have a multimillion dollar budget that says I am not - how about you?

      For all your posturing, you sure don't seem to be thinking all that clearly about these issues. I don't even work on anything which has to be as reliable as space hardware and I can easily poke holes in the things you're saying.

    95. Re:The Text by blonkm · · Score: 2, Interesting

      Well, undecidability, maybe no. But provability - yes. There are plenty of algorithms that yield results, but we haven't the faintest idea why. The models don't fit into regular mathematics or at least not any mathematics that we understand or have developed yet. I am talking about neural nets and genetic algorithms. Say a sample neural net/genetic algorithm can be trusted and 'verified' to result in a useful solution perhaps 90% of the time, measured on a large amount of tests. How are you going to prove mathematically that this 90% will hold over time, if you don't even know how to describe the solution (the solution is developed by the program itself over time). It's inherent to chaos theory that you cannot predict what will happen at that level of 'randomness'. But please prove me wrong! (pun intended)

    96. Re:The Text by Chris+Burke · · Score: 1

      An FPGA reads a binary stream of data, and "wires" the interconnect based on that. I think it is a bit of a stretch to call that "interpreting a mathematical description."

      Since that "wiring" is as real a "wiring" as when a CPU's ALU gets "wired" to the register file when a processor reads an ADD instruction, I'm not sure I see the difference here. Other than the control inputs for the muxes and tri-states in an FPGA are often in static memory and infrequently if ever changed.

      Try this: What's the difference between a stream of binary that's used to program an FPGA, and a stream of binary data that's used to program a software simulation of an FPGA? Not the difference between an FPGA and a software simulator of an FPGA! That's obvious, one's hardware one is software. What's the difference between the binary streams. Either way, it's an mathematical description of how a device is supposed to work. A formula.

      I dunno, maybe it's because I'm neck deep in simulators all day, running a program that simulates a computer so as to run a program, running a program that simulates hardware based on an HDL description so as to run a program, combinations thereof. To the extent that the same program behaves differently running on hardware or another program, that's because the simulator program is using an inaccurate formula for modeling physical reality.

      But I suppose that I will never convince you. So, yes, call it whatever you want.

      It is at conceivable that you could convince me that programs for FPGAs on FPGAs represent a meaningful gray area where language and physicality blend. It is inconceivable that you could convince me that software is more or less than a symbolic representation of math, a formula, because that's literal fact, so not lyin your chances are nil.

      --

      The enemies of Democracy are
    97. Re:The Text by Glonoinha · · Score: 1

      Actually software can be proved correct.

      It's an extension of computer language theory that leverages the concepts surrounding deterministic / finite state machines and asserts some of the theory in the transform from non-deterministic to deterministic.

      It was painfully obvious to me when I saw it, and I honestly couldn't believe that the end of the semester didn't bring it all together to show that software can be provably correct - meaning I may need to actually draw the line to connect the dots for the rest of the world to see. If that's the case, I'm going to have a slam-dunk doctoral thesis.

      --
      Glonoinha the MebiByte Slayer
    98. Re:The Text by sentientbrendan · · Score: 1

      >(2) Programs manipulate numbers. Mathematic formulae manipulate numbers. It's an entirely reasonable conclusion that he has reached that a program is merely a formula.

      Dude, saying stuff like that makes me wince.

      First of all, mathematics does not "manipulate numbers". That's arithmetic. Mathematics is much more general. Ultimately mathematics is just symbol manipulation. Also, a mathematical formula *is* a set of symbols, so you can do math about math.

      Second of all, programs don't "manipulate numbers". A calculator manipulates numbers. A program manipulates symbols, which may happen to represent numbers, or anything else for that matter. A program also *is* a set of symbols, so you can write programs that manipulate programs.

      Third and finally, Dijkstra didn't have to conclude *anything* about programs between formulas, because that's always been known. Where do you think programs came from anyway?

      A computer is an automated mathematician. That's always been the idea, literally since the 17th century (Liebniz). That computer science curriculum has been so dumbed down that programmers who graduate from universities don't understand the basic idea that computer programming is just math, is why Dijkstra wrote the article.

      Let me nail this down in case people still aren't getting this.

      1. A programmer does some symbol manipulation and produces a formula, which is conventional terminology is called a computer program.
      2. The computer then takes that formula, and continues manipulating the symbols until the result is achieved.

      There's no real difference between what the computer and the programmer do, except that the computer is faster at it. There's no real difference between what a programmer and a mathematician do either. Programmers, computers, and mathematicians are all the same sorts of things, and the same techniques (proofs) are applicable to all of them.

      Dijkstra is pissed off in the article that people write software "tests", which can never show the correctness of a program, when they should be writing proofs that *can* show the correctness of the program.

    99. Re:The Text by Anonymous Coward · · Score: 0

      I have a multimillion dollar budget that says I am not - how about you?

      Oh that's funny. That's about the most ridiculous argument I've ever heard. Proof by funding. I will call this "Reductio ad nummus" (OK, that's probably an abomination, I never took Latin.) You could just be a smooth talker that convinces management idiots that you know something, to get money. I obviously don't know that you are, but please, you can't tell me that you haven't seen idiots with big budgets before. At least I could respect "I've already designed XXX successful avionics systems in my YY year career" or "This approach solved the disastrous problems on the ZZZZZ avionics system." I couldn't really know if you were bullshitting, but come on, "I have a big budget" is just pitiful. Will you compare penis size next?

    100. Re:The Text by tuomoks · · Score: 1

      Interesting thread, I have enjoyed reading it and I agree, hardware matters. I haven't done avionics but even in manufacturing and business if you need absolute(?) correctness you have to code for that. Now - I could argue the coding technique, it really depends on hardware / compiler, but you are basically correct that the logical correctness is not enough. I have seen this happen in mainframes with all the hardware checks - ouch, took two weeks to find, a execution sequence caused an error in one of 8 pipelines (which system had 8 pipelines in 70's?) which caused ONE BIT change almost randomly in memory. And so on, more on manufacturing (harsh!) environment and even in NonStop systems - hardware just doesn't always work as it was supposed to so you have to code for all(?) exceptions using checkpoints, parallel execution and comparison, branch backs, partial or full restarts, etc, etc..

      Anyway, IMHO Dijkstra was right in many things. We could use more intelligent programming, I'm tired (over 35+ years) "fixing" programs which are overly long and complicated for the task they were (supposed) developed. And try to find (outside of the open source) developers who can code drivers, memory manager routines, communication stacks, decent queuing, etc without some convoluted DDK/SDK - good luck!

       

    101. Re:The Text by xenocide2 · · Score: 1

      The halting problem is not a problem in interrupt routines, unless your interrupts happen to check whether they'll terminate before they try executing. What you are discussing is real time priorities, which thankfully many smarter people than I have studied deeply and constructed theory for. In this case, a switch statement (ie a series of if statements implemented efficiently) is one way to implement it. Another, way is to have interrupt priorities and interrupt vectors in hardware and have smart programmers trained in concurrent programming logic write re-entrant code.

      In my experience, software engineers are generally not up to the task of reasoning about interrupt based systems, so the standard is retard control loops.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    102. Re:The Text by xenocide2 · · Score: 1

      The premise in his paper was can't use tests to prove a program is correct, only to prove it's incorrect. This is separate from proving programs correct in the general sense.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    103. Re:The Text by risk+one · · Score: 1

      What do you think this is, wikipedia?[citation needed]
      Cultural References
      "What do you think this is, Wikipedia?" was referenced in an episode of Family Guy, when Stewie BUSH SUCK RETRADS HAHAHAH

    104. Re:The Text by Secret+Rabbit · · Score: 1

      To your (1), and I know this is nitpicking, you're wrong. In maths courses, it is entirely NOT silly to discuss "algebra engineering." In fact, when actually discussing maths, it is a necessity when considering where things come from. In fact, I've seen courses on such things at Universities. The courses are typically disguised with names such as "Construction of the Number Systems" or similar. As in, you build the number systems and there properties. One of those properties being there algebraic properties. It's nice to know that things will always distribute, etc. But, I'll also mention that such things are taught in brief when studying other subjects. I've seen Fields in Modern Algebra as well as Analysis and Linear Algebra courses. It's necessary and wise to do these things when discussing proper maths.

    105. Re:The Text by cyphercell · · Score: 1

      I've got my associates in CIS. I was browsing around here reading about P=NP problems. I looked it up and found the traveling salesman problem. Hah. That's funny. It's a neat problem and applies to networking among other things. But, in the specific case of the salesman, it's relatively easy to setup a database and have airline employees enter in their coordinates. Then the programming becomes very straight forward.

      --
      Under the influence of Post-Cyberpunk Gonzo Journalism
    106. Re:The Text by Secret+Rabbit · · Score: 1

      Actually, some things are impossible to view with the Forces view whereas the Energy view can model, as far as I know, everything. So, no, they aren't equally correct models. Just think about QM as an example if you think I'm wrong.

    107. Re:The Text by RockDoctor · · Score: 1

      Turning? TurNing?! Woe be to us, for all is certainly lost.

      Hold up there for a minute! don't go a-wailing and a-gnashing your teeth just yet - I haven't checked for the rest of the universe in the crack down the back of the sofa ... [/self searches] ... Nope all is not there, though I've found a joint's worth of hash, 35pence in change, and a lot of belly-button fluff.

      But all is not there, so it's OK. Get back to your wailing and gnashing of teeth.

      --
      Birds are not dinosaur descendants;birds are dinosaurs, for all useful meanings of "birds", "are" and "dinosaurs"
    108. Re:The Text by theaveng · · Score: 1

      Engineering an airplane wing is more than just a mathematical proof or program. It's physical; it has its own properties which must be obeyed, else the wing will fold in half and the plane will plummet to the ground. These are not considerations a software guy needs to know. All he cares about is the pure math (like any other mathematician) and leaves it to the hardware engineers to worry about failure modes of real materials.

      --
      FOX NEWS.com should be BANNED from television and internet. Have the Congress take it over and give us Truespeak.
    109. Re:The Text by theaveng · · Score: 1

      >>>What I am arguing about (mainly) is his statement that there is no such thing as software engineering

      There isn't. When was the last time you looked-up the tensile strength of steel, or considered the maximum temperature of a resistor, or what happens when a bomb blows-up next to your CPU missile-launching card (shock and vibration)? Probably never because software guys only care about the pure math that makes-up their programs (which are long proofs).

      --
      FOX NEWS.com should be BANNED from television and internet. Have the Congress take it over and give us Truespeak.
    110. Re:The Text by theaveng · · Score: 1

      I deal with 1s and 0s and their mathematical manipulation.

      I don't know what you're talking about.

      Maybe you weren't properly trained which is why your post is a confused mess? Stop trying to tie pure math (programs) to the real world. It's not relevant.

      --
      FOX NEWS.com should be BANNED from television and internet. Have the Congress take it over and give us Truespeak.
    111. Re:The Text by theaveng · · Score: 1

      A computer is an automated mathematician. That's always been the idea, literally since the 17th century (Liebniz). That computer science curriculum has been so dumbed down that programmers who graduate from universities don't understand the basic idea that computer programming is just math

      Then we agree.

      Dijkstra is pissed off in the article that people write software "tests", which can never show the correctness of a program, when they should be writing proofs that *can* show the correctness of the program.

      Quoted for truth. I suspect that a graduate in mathematics would probably make a better software programmer than those who graduate with CS/CE degrees. Perhaps slower, but it would the proof/program could be verified to be bugfree.

      --
      FOX NEWS.com should be BANNED from television and internet. Have the Congress take it over and give us Truespeak.
    112. Re:The Text by chain_from_hell · · Score: 1

      How about an operating system? It's an algorithm that's continuously looping, responding to user inputs. You can only predict the outcome of an algorithm if you can precisely define the input, and in this case the input has an extra element: time.

      Million monkeys banging on keyboards? How's that for input statement...

    113. Re:The Text by COMON$ · · Score: 1

      Nice, Real rockets or model rockets. Personally I have been brewing, wave of the past and future!

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    114. Re:The Text by Intron · · Score: 1

      Estimates of software reliability are 1 - 10 errors per 1000 code lines in production code. Hardware is many orders of magnitude more reliable, so spending any lines of code worrying about random hardware errors is a mistake - it introduces more errors than it will ever fix. The system reliability has to be based on other factors like redundancy, end-to-end parity/ECC, journalling, etc.

      --
      Intron: the portion of DNA which expresses nothing useful.
    115. Re:The Text by Chode2235 · · Score: 1

      I think that further validates the point, right?

      I kid Steve Jobs.

    116. Re:The Text by WhiplashII · · Score: 1

      Big rockets - basically light aircraft that can go from Chicago to Shanghai in 50 minutes. We'll see how it goes...

      --
      while (sig==sig) sig=!sig;
    117. Re:The Text by WhiplashII · · Score: 1

      When was the last time you looked-up the tensile strength of steel

      Interestingly enough, this morning at approximately 10 AM...

      considered the maximum temperature of a resistor

      Well, that's probably been a few days - the ignitors are actually working...

      a bomb blows-up next to your CPU missile-launching card

      Would you include a rocket engine hard start scenario? That would be this morning as well... go to be sure that aircraft remains flyable in the event of catastrophic engine failure...

      Probably never because software guys only care about the pure math that makes-up their programs

      Since it is not never, do you agree that your point is invalid?

      I can see the usefulness of considering your program a proof - but he never talked about that in the paper. I also think that considering your program a proof makes it much harder to program, and so not all programs should be done that way (do a cost/benefit analysis first). In addition, there are very easy ways to avoid complexity in many applications... which again makes the proof argument overkill.

      As an engineer, I know about that tool - and I can decide if that is the proper tool. For flight control systems, it probably is. For engine avionics, it isn't.

      Why do you think that ever problem has the same solution (mathematical proofs)? What is the difference between the engineering of a Mach 25 aircraft and the engineering of it's flight control systems?

      --
      while (sig==sig) sig=!sig;
    118. Re:The Text by WhiplashII · · Score: 1

      But that is where I disagree - when I am programming the avionics computer, for example, I need to know that the CPU that it is running on will occasionally lock up (gamma ray hits the output buffer transistor) x% of the time. I need to know that the memory cells may change at any time - and the aircraft better not fall out of the sky. I need to know that the total processing speed is limited and somewhat variable - so I better have the important stuff done early in the processing cycle.

      Just because you do not need to know such things, does not mean I don't. Software engineering DOES exist - you just don't do it.

      --
      while (sig==sig) sig=!sig;
    119. Re:The Text by WhiplashII · · Score: 1

      This is true in some cases, it is not true in others.

      For example, the class of craft I am currently working on typically has at least one hardware error every 30 minutes of so... so you better be planning for it.

      --
      while (sig==sig) sig=!sig;
    120. Re:The Text by WhiplashII · · Score: 1

      Precisely - except that in this type of programming, the system has been greatly simplified in order to make it easy to program. We only use a single interrupt, that fires off a timer. The very first thing that happens is that we reset the stack (if applicable), and clear the interrupt flags so that the interrupt can fire again. Then the program flows from most important tasks (for example, the check "if engine=explode then fuel=stop") to the less important tasks (update the nav computer display to show random facts about the closest nav point). That way, if we are currently passing through the South Atlantic Anomaly and the computer is resetting 50 times a second because of a solar flare, the nav system may be toast but the engines won't explode.

      I agree that many people that are called software engineers aren't, but not all...

      (My joke about the halting problem is silly, but consider trying to prove that a loop will exit under the assumption that another process [gamma rays] is continuously overwriting your variables)

      --
      while (sig==sig) sig=!sig;
    121. Re:The Text by WhiplashII · · Score: 1

      Good point - but the same is true about a bridge design. We can prove that it will fail, but we can't prove it will stay up.

      Would that we could - that would save many, many lives.

      Engineers have to deal with uncertainty, in software as well as in hardware.

      --
      while (sig==sig) sig=!sig;
    122. Re:The Text by xenocide2 · · Score: 1

      Would that we could -- point is in most cases we can but don't. Software is not bridges.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    123. Re:The Text by WhiplashII · · Score: 1

      For all your posturing, you sure don't seem to be thinking all that clearly about these issues.

      Interestingly enough, I am actually more explaining the current state of the art... I guess you just disagree with all us dummies ;}

      Once the hardware is as good as can be done, it will still have errors. And there is still the trade-off between giving the hardware another 9 in reliability, and writing the software to get around it.

      --
      while (sig==sig) sig=!sig;
    124. Re:The Text by WhiplashII · · Score: 1

      I agree - I only say stuff like that to people that seem to only value such statements.

      Even more ridiculous, is making such statements on a psuedo-anonymous web site like this one! (I mean really, how does anyone here know what I am really doing? Maybe if they are stalking me they will note a certain consistency in my posts, and that I seem to know more about aircraft/space vehicle design than most, but I could be anybody!

      --
      while (sig==sig) sig=!sig;
    125. Re:The Text by WhiplashII · · Score: 1

      Teach them how to see the solution

      I really wish the paper had been about the mechanics of that - to me, that is the missing link. But I have to admit, I'm not sure such a thing can be taught.

      --
      while (sig==sig) sig=!sig;
    126. Re:The Text by WhiplashII · · Score: 1

      I wish to subscribe to your newsletter - how can you prove that a real life bridge will stay up? You can never know all the details of the land surrounding it, nor the weather it will face, nor even the materials it will be constructed from.

      And that is something we have been building for millennia! The best you can do is to "assume a spherical chicken", and say if the material used has a less than 50% deviation from typical strength, and the weather is similar to what we have seen in the last 100 years, and the soil is similar in important respects to the last bridge we built, it will stay up. But we cannot even know what important things we may have missed - there are always unknown, unknowns!

      Engineering is working through the known known (the things you know you know), finding out about the known unknowns (the things you know that you don't know), and praying about (adding margin for) the unknown unknowns (the things that you don't know that you don't know).

      That's why rockets explode - there are still a lot of unknown unknowns, so it is not possible to eliminate errors. As we fly them more often, the unknown unknowns become known unknowns and then quickly become known knowns... and the failure rate goes down. That's why it makes the news when a bridge fails - but they still fail from time to time.

      --
      while (sig==sig) sig=!sig;
    127. Re:The Text by 1729 · · Score: 1

      Well, undecidability, maybe no. But provability - yes. There are plenty of algorithms that yield results, but we haven't the faintest idea why. The models don't fit into regular mathematics or at least not any mathematics that we understand or have developed yet. I am talking about neural nets and genetic algorithms. Say a sample neural net/genetic algorithm can be trusted and 'verified' to result in a useful solution perhaps 90% of the time, measured on a large amount of tests. How are you going to prove mathematically that this 90% will hold over time, if you don't even know how to describe the solution (the solution is developed by the program itself over time). It's inherent to chaos theory that you cannot predict what will happen at that level of 'randomness'. But please prove me wrong! (pun intended)

      You still ought to be able to prove the correctness of your algorithm even in this case; that is, each component (subroutine, loop, etc.) can be verified in terms of pre- and post-conditions, and the program can provably compute the algorithm in question. If the program is non-deterministic, you might have to prove that the output of some subroutine is X with probability p, Y with probability q, etc., but you can specify the set of outputs and guarantee that the program will run as designed. In other words, it won't crash (assuming the underlying hardware behaves as it should, which is perhaps a dangerous assumption), and it will compute what it is supposed to compute.

      If your algorithm is based on heuristics and randomization, then perhaps you can't precisely specify the output. Yet you can still prove (given some assumptions about the hardware, etc.) that the algorithm will be correctly executed.

    128. Re:The Text by 1729 · · Score: 1

      How about an operating system? It's an algorithm that's continuously looping, responding to user inputs. You can only predict the outcome of an algorithm if you can precisely define the input, and in this case the input has an extra element: time.

      For an OS, you can prove that certain conditions hold before and after some operation. If an OS can be assumed correct at time t, and the possible states at time t+1 are known and can be formally verified, then by induction the OS will continue to run correctly.

      Of course, in practice this could be very difficult, but the problems seem to be practical, not theoretical. In fact, it appears that Dijkstra proved the correctness of THE:

      http://en.wikipedia.org/wiki/THE_(operating_system)

    129. Re:The Text by Anonymous Coward · · Score: 0

      Only one should be deemed correct. But if you adapt the "engineering" and "outcome" point of view, both are correct.

      My deciding criterion for these situations is which one appears more 'elegant'. The 'if' statement solution is definitely NOT elegant.

    130. Re:The Text by Anonymous Coward · · Score: 0

      It certainly is evocative of what he is likely doing in his grave... well, except that dead bodies don't do that, and his was cremated at Woking and scattered elsewhere.

    131. Re:The Text by Saint+Fnordius · · Score: 1

      I think you are missing the point, but just barely: software is a set of instructions, like formulae are. Formulae are instructions on how to reach a sum, and software is a set of instructions on how to set circuits inside a computer. They are alike, but not entirely the same.

      The other thing to realise is the magnitude of complexity in software means that emergence kicks in: the set of instructions begins to behave like a physical object, and engineering approaches gradually apply. Sure, there are maths in there, but it's no longer so relevant to the design of the set of instructions. Refining and redesigning the code becomes more analogue to engineering, redesigning a structure for better performance and so on.

      It's easy to forget this since the first purpose of computers was to compute. Solve mathematical problems. But modern usage of these machines has gone beyond that, so seeing the set of instructions we call software as merely mathematical formulae cheapens the term "formula".

    132. Re:The Text by Chris+Burke · · Score: 1

      I think you are missing the point, but just barely: software is a set of instructions, like formulae are. Formulae are instructions on how to reach a sum, and software is a set of instructions on how to set circuits inside a computer. They are alike, but not entirely the same.

      Close, but not quite. Software is a set of instructions on how to reach a mathematical result. You will not find anything in the definition of an x86 ADD instruction that refers to circuits or necessarily requires them. You can perform that ADD instruction completely correctly using a software simulator, or even by hand. The only difference between the language of math in a textbook and the language of math in a software instruction set is that the latter is designed to be read by a computer, but this need not be the case.

      Computer vs human readability. That's the only difference between software and hand-written mathematical instructions. Both are formulas, both are math.

      The other thing to realise is the magnitude of complexity in software means that emergence kicks in: the set of instructions begins to behave like a physical object, and engineering approaches gradually apply. Sure, there are maths in there, but it's no longer so relevant to the design of the set of instructions. Refining and redesigning the code becomes more analogue to engineering, redesigning a structure for better performance and so on.

      Complexity will never make math not-math. Emergency is an aspect of math, not an escape from it. Of course you will be concerned with the physical practicalities of your formula, that doesn't mean a formula is now something else. Or have you never re-factored a hand-written algorithm to be more efficient or convenient to calculate by hand? The initial justification for the electronic computer was because human computers weren't fast enough at calculating artillery trajectories. How did changing from doing the calculations with pen and paper and a human brain, to doing them by an electronic device, change those calculations from a formula to a not-formula? What about when they decided to increase efficiency by hiring whole rooms of computers (in the original sense of a human being tasked with computation), is that when it became not-math?

      It's easy to forget this since the first purpose of computers was to compute. Solve mathematical problems. But modern usage of these machines has gone beyond that, so seeing the set of instructions we call software as merely mathematical formulae cheapens the term "formula".

      It's easy to forget that that's all a computer program is doing today. Thanks to hardware some of those calculations have effects other than the simple computation, but the software has no idea that when it assigns a value to a particular location in a matrix that a piece of hardware is going to use that value to control the output of a cathode ray tube. As far as the software is concerned -- and more importantly, defined -- it's doing nothing but calculations and assignments. Frankly I think you're the one cheapening the term "formula" by limiting it to simple hand-written calculations of sums.

      --

      The enemies of Democracy are
    133. Re:The Text by COMON$ · · Score: 1

      Interesting, got any links I can keep tabs on?

      --
      CS: It is all sink or swim...oh and did I mention there are sharks in that water?
    134. Re:The Text by WhiplashII · · Score: 1

      Not yet - we are still very quiet.

      The wraps should come off next March or so. I'd give you the company name, but honestly it will most likely change before then (engineers choose working names, marketing chooses launch names).

      If it all works right, you shouldn't be able to miss it, though!

      --
      while (sig==sig) sig=!sig;
    135. Re:The Text by Anonymous Coward · · Score: 0

      Moreover, he was fully aware of the incompleteness theorems but you must not confuse the fact that some formulae cannot be proved to either be true or false with the possibility that no formulae can be proved true (which is clearly false).

      According to Dijkstra, the key is not only to choose formulae that admit a proof but they must also admit a simple, elegant and short proof, at that. This is a very important point: to keep a project constantly under intellectual control, we must restrain ourselves to the class of intellectually manageable programs (which is even more restricting than GÃdel's incompleteness theorems).

    136. Re:The Text by xenocide2 · · Score: 1

      My point is that if we could prove a bridge would stay up, it would be in the best interests of society to do so.

      Rockets have not exploded from "gamma rays". They have exploded from catastrophic timing failures; people have gone back and looked at the Arianne V and proved it couldn't have worked in specific circumstances. Specific circumstances that were not exercised during testing. Specific circumstances that could have been avoided by world class software. Instead they tried to save money by integrating the software to Arianne IV and calling it a day; when the launch count deviated for 30 minutes, our good friend overflow showed up. You don't have to crash a rocket to know what integer overflow is, but apparently we need to crash more of them before its worth looking for them in the source.

      And this is Dijikstra's point: we are not at the point where entropy is the primary engineering cause of software failure (certainly not when he wrote that), and trying to pretend that software is just like structural engineering leads to flawed analogies you consistently lean on.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    137. Re:The Text by WhiplashII · · Score: 1

      I can see the point, really. My point is that, while I agree that what Dijikstra does is not a software engineer, that does not mean that software engineers do not exist. Microsoft was the most successful software company in the world. Let me ask you - was their ability to write bug free code a factor?

      No - software engineering is not about producing bug free code. Software engineering is about producing software. Balancing time, money, and equipment against production.

      You may not do it, but that doesn't mean others don't.

      (And, your right, the Arianne software error was a silly waste - and almost certainly should have been caught. But formal proofs would not have caught it... the implementation error would have required looking at things at the hardware level, not the algorithm level.)

      --
      while (sig==sig) sig=!sig;
    138. Re:The Text by Saint+Fnordius · · Score: 1

      I think we are close to consensus, but not quite there all the way. It's the tiny little niggling details where we differ.

      I am not trying to make math "not-math", but my statement is that on top of mathematics an engineering approach is also valid. The difference is that engineering deals with the emergent behaviour instead of directly dealing with the maths underneath. An imperfect analogy would be using a compiled high-level language rather than machine code. The machine code is still there, but a different approach is used.

      The reason I think of a computer program as more than just maths is because although the vast core of programming is maths, there are still instructions to deal with the interface. I would even dare to suggest that maths is itself an emergent behaviour over the setting of switches. Formulae allow us to understand the complex setting of these switches and circuits that make up hardware.

      I think others in this discussion have expounded both of our viewpoints sufficiently. Our differences are now getting into the philosophic of whether the universe a model of formulae is or formulae a model of the universe. I even consider some forms of mathematics to be engineering, only instead of dealing with, say, the flow of liquids it deals with the flow of data. Our neurons and the circuits of the computer are the pipes and pumps, and the formula the blueprint of the plumbing, so to speak!

      Ahem. I'm getting carried away here.

      I only hope that I have been able to defend the position that an engineering approach can also be valid in designing computer code. I never doubted your viewpoint, but I did feel it worthwhile to point out where mine differs. Cheers!

    139. Re:The Text by xenocide2 · · Score: 1

      Specifically on the case of the Arianne V; I imagine my own professors disagree simply by the photography time series on the cover of our programming logic book. It's a set of photos of the Arianne launching and exploding. And I'm inclined to agree with them; detecting a downcast is simple enough and not hardware dependent. It should have been the case that a proof that the system never enters that condition was found before disabling the trap for performance reasons; instead we have a very expensive case of premature optimization ;)

      If Djikstra's abilities isn't part of software engineering, then I'm afraid the typical tension between traditional engineering and software shall remain. Engineering is about producing designs to the best of our human ability. If you as an engineer know a design to be faulty and risks human life, you have an ethical obligation to not sign off on it. This means that the "balance" as you put it, is not in favor of time, money or production. What you've described can best be placed under the heading "management", and your comparison to Microsoft betrays you here.

      Microsoft was a mediocre software development company. What they really became good at was not writing software, but buying and selling it. They specialize in negotiations with large companies, and all their flagship software shows it. But despite their apparent success, I don't think many avionics software engineers are quick to claim themselves engineers of the Microsoft variety.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    140. Re:The Text by WhiplashII · · Score: 1

      True. I guess my real issue is that what students are taught in Computer Science degrees (mostly about the thing you mention - correctness proofs, computation theory, etc.) does not adequately prepare them for their real job (deciding when and what algorithms to use).

      For example, saving a few bits of storage in the guidance system of a rocket is a bad optimization - as you say. But there are many times where incorrect optimizations are the correct way to solve a problem. For example, did you know that one of the early Cray computer hardware was designed (on purpose) using an algorithm (I think for division) that was very fast, but did not always produce the correct result. This was a good design - the incorrect result was a very rare case that could be checked for in software.

      Often, the most important thing in software is not correctness - and the fact that you poo-poo Microsoft (and, yes, admittedly I poo-poo them too) really just seals my point. Microsoft was the best software developer on the planet - and it was not because of their ability to write good code. The metric of a software engineer is not "lines of bug free code", or something like that - it is "value brought to society".

      So you have to balance many things - time, money, effort, and yes, correctness. But in our world 100% correctness is only marginally more valuable than 99% correctness - and the difference in resources required to achieve those standards is enormous.

      --
      while (sig==sig) sig=!sig;
    141. Re:The Text by xenocide2 · · Score: 1

      Cray computer hardware was designed (on purpose) using an algorithm (I think for division) that was very fast, but did not always produce the correct result.

      Admittedly, I was not alive at the time, but I'd like a good cite on that fact. As I understand it, Cray's innovative design was to build division and multiplication operations out of smaller instructions like bitshifts, because the resulting Reduced Instruction Set was capable of clocking faster. Perhaps you're confusing RISC with floating point operations, which ALWAYS have a range of error to be considered.

      But I'll feed you an alternative fact to support your theory: NP complete problems are generally insolvable on computers and we instead use approximations that have a much more amenable runtime. But unlike your suggestion, instead of just accepting this as demonstrating that proofs are unworkable in real world, we use proofs to show that a solution is within an acceptable percentage of the optimal solution. It turns out that a number of operations algorithms are NP-complete, so this is very relevant to avionics software and real time computing.

      If you honestly believe that "value brought to society" is the metric of a software engineer, then you've set in concrete Dijikstra's (and my) point that software engineering as practiced today has nothing to do with computers in particular.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    142. Re:The Text by WhiplashII · · Score: 1

      Cray's innovative design was ... Reduced Instruction Set

      No - Cray didn't do RISC, he did Vector math. I don't have a cite - I did look - but it came up in my CPU design class way back when. (When I took the class, the Cray-1 was still pretty cool!)

      If you honestly believe that "value brought to society" is the metric

      I think that is the proper metric for basically any profession... and I do agree that software engineering as practiced today has nothing to do with computer science as taught today - and that this is a problem. I think where we disagree is that you seem to think that industry is wrong, and I think that academia is wrong.

      To a certain extent, both are useful - I see the value in computer science in academia, with the trickle down effects. I just think that if the goal is to give students (that are going to earn a living creating code) a valuable education in exchange for their money, that goal is not achieved by moving education away from the practical and towards the theoretical. In other words, academia is being payed by students to prepare them for industry - the answer (in most cases) is not to say that industry is wrong.

      (And just to clarify - I have written a LOT of code, used in a lot of different systems. I maintain it, and do virtually all the debugging. My code almost always works the first time, and I don't use formal proof methods. But I also take longer to examine procedures where my companies could lose money than to examine procedures that are less important - that sort of thing is the reason my salary is 3 standard deviations from the mean. I don't say this to brag, I say this to show the value in thinking about "maximizing value to society" rather than correctness.)

      --
      while (sig==sig) sig=!sig;
    143. Re:The Text by xenocide2 · · Score: 1

      From the wikipedia on RISC:

      The first system that would today be known as RISC was not at the time; it was the CDC 6600 supercomputer, designed a decade earlier, in 1964, by Jim Thornton and Seymour Cray... Thus the joking comment later that the acronym RISC actually stood for "Really Invented by Seymour Cray".

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    144. Re:The Text by WhiplashII · · Score: 1

      How funny! I guess since I was learning about it at the time, and the Cray wasn't RISC, Cray got no credit for it. All the credit went to the MIPS guys, and the 68000 and PowerPC guys.

      And here Cray invented it!

      Can't say I'm totally surprised though. I still remember being sad when I heard he had passed... he was a great engineer.

      --
      while (sig==sig) sig=!sig;
  2. Mine was certainly cruel to us by MikeRT · · Score: 5, Funny

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

    1. Re:Mine was certainly cruel to us by Anonymous Coward · · Score: 1

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

    2. Re:Mine was certainly cruel to us by 91degrees · · Score: 1

      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.

    3. Re:Mine was certainly cruel to us by scubamage · · Score: 0

      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.

    4. Re:Mine was certainly cruel to us by mmkkbb · · Score: 3, Insightful

      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.

      --
      -mkb
    5. Re:Mine was certainly cruel to us by DiegoBravo · · Score: 4, Informative

      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 :

              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.

    6. Re:Mine was certainly cruel to us by chrb · · Score: 5, Interesting

      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!".

    7. Re:Mine was certainly cruel to us by ardor · · Score: 1

      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.

      --
      This sig does not contain any SCO code.
    8. Re:Mine was certainly cruel to us by AceofSpades19 · · Score: 1

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

    9. Re:Mine was certainly cruel to us by Thaelon · · Score: 1

      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.

      --

      Question everything

    10. Re:Mine was certainly cruel to us by PitaBred · · Score: 1

      On the other hand, I wouldn't suggest Java before C++. I had a buddy who learned Java first, and it may have been the way that it was taught, but memory allocation and such never made sense to him until he learned C++, then everything he learned in Java became clear, and he got much better, almost overnight.

    11. Re:Mine was certainly cruel to us by EastCoastSurfer · · Score: 1

      The profs have a clue, it's more that the potential incoming students do not have a clue. After the .com bust, CS enrollment plummeted. In order to get students to pay for classes and thus pay teachers they have to 'sell' potential students on CS. This means not destroying them on during their first class and working hard to make those first classes relevant and interesting. Though, I do agree that getting through an entire degree program without doing pointers (and C) is a travesty.

    12. Re:Mine was certainly cruel to us by detox.method() · · Score: 1

      Having kids like me use Visual Studio isn't cruelty, it's downright evil.

    13. Re:Mine was certainly cruel to us by ciderVisor · · Score: 4, Funny

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

      C - all the power and flexibility of assembly language combined with the readability and maintainability of assembly language.

      And I say that as someone who loves C.

      --
      Squirrel!
    14. Re:Mine was certainly cruel to us by Anonymous Coward · · Score: 0

      Even in mobile phones it's 100% C/C++ for the phone firmware. Java is only used for games.

    15. Re:Mine was certainly cruel to us by EastCoastSurfer · · Score: 2, Insightful

      There is nothing wrong with learning Java, although that's not what you should be doing for 4 years during a CS degree. During my degree some classes used Java, some C, Python, whatever the teacher felt like that semester (or was required because of the class). It was the students responsibility to learn the language on your own time. Class time was for learning about the theory that underpins *all* languages and other big topics that span multiple languages like OO, etc....

    16. Re:Mine was certainly cruel to us by ciderVisor · · Score: 1

      Having kids like me use Visual Studio isn't cruelty, it's downright evil.

      Visual Studio is a fantastic IDE.

      --
      Squirrel!
    17. Re:Mine was certainly cruel to us by asc99c · · Score: 1

      Well not only that, but huge sections of PC / server stuff is still written in C. MS Windows and Office I believe are both written in C / C++. Linux is written in C. Open Office is mostly C++. From troubles interfacing with it, I'd have to guess the core of SAP is written in C.

      That's a selection of some of the biggest software products around for PCs and servers, and it's still written in C / C++ even today. Most of the stuff I do at work is C also.

    18. Re:Mine was certainly cruel to us by orclevegam · · Score: 1

      I think the best teaching language is Perl, followed by assembly, C, and then Java. Do things in that order and you'll have an excellent understanding of first variables and data structures, then pointer arithmetic and binary math, followed by functional and then object oriented programming. You can also pickup a bit of the functional and object oriented concepts while doing Perl.

      --
      Curiosity was framed, Ignorance killed the cat.
    19. Re:Mine was certainly cruel to us by orclevegam · · Score: 2, Insightful

      Agreed, with the exception that I think that assembly should be taught prior to Java or even C. With C the concept of a pointer is a rather abstract concept, but with assembly it's a very concrete and easy to understand component of the language.

      --
      Curiosity was framed, Ignorance killed the cat.
    20. Re:Mine was certainly cruel to us by msuarezalvarez · · Score: 1

      Why not teach functional concepts using a functional language, and OOP using an object oriented language?

      In any case, I simply cannot believe you are not joking with your proposal of perl.

    21. Re:Mine was certainly cruel to us by msuarezalvarez · · Score: 1

      Those are not only some of the biggest software products, but also some of the oldest modern apps.

      Why do you seem to correlate having trouble interfacing with something with that something's being written in C?

    22. Re:Mine was certainly cruel to us by orclevegam · · Score: 1

      Exactly, which is why introductory courses should be taught using notepad, vim, emacs, or your choice of standard text editor. If the language you're using can't be used effectively without and IDE you shouldn't be using it for an introductory course.

      My recommendation? Assembly using notepad++ or vim depending on the platform you happen to be on. For assembler either NASM or LLVM, although GCC will do in a pinch.

      --
      Curiosity was framed, Ignorance killed the cat.
    23. Re:Mine was certainly cruel to us by TheRaven64 · · Score: 3, Insightful

      And if you want to really understand a language, you should learn a lower-level and a higher-level one. If you want to write good Java code, spend some time studying C and Smalltalk. If you want to write good C, learn an assembly language or two and something like Java.

      --
      I am TheRaven on Soylent News
    24. Re:Mine was certainly cruel to us by TheRaven64 · · Score: 3, Informative
      And, sadly, only the second part of that is true anymore. A few examples of things that are in a modern assembly language and not in standard C:
      • Vector operations.
      • Atomic operations.
      • Condition codes for overflow checking on arithmetic.
      --
      I am TheRaven on Soylent News
    25. Re:Mine was certainly cruel to us by Panoramix · · Score: 1

      What's wrong with learning Java?

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

      Look, any programming tool requiring 50M of virtual memory to run Hello World is just wrong. And don't say peep about memory being cheap and such -- I'm talking wrong on general principle. Morally wrong.

      Yes yes, I am being a jerk here. But I do dislike Java. With intensity.

      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.

      All kidding aside, I think Java as a learning language is not a bad choice. Yeah it makes you sloppy with resources, but it makes you write clean code, which is more important. Much like Pascal, it forces good coding practices on you by making it hard if not impossible to avoid adopting them.

      However, I think J2EE, or whatever it's called these days, is pedagogically toxic. It encourages that sort of hazy understanding of how and why your app runs at all... no really, look at them kids deal with problems: by checking every available checkbox and option until behavior changes. And I don't blame them: those Java frameworks are so huge and convoluted it's just impossible to completely understand them, so you end up debugging by trial and error. Or copying and pasting snippets and hoping for the best.

      I don't think I'm being biased here, I honestly think that's not a very good way to learn this trade.

    26. Re:Mine was certainly cruel to us by Anonymous Coward · · Score: 0

      Better than what they did at my university.
      Our very first programming class was in Python.
      AWESOME. Then from that point on it was all Java.

    27. Re:Mine was certainly cruel to us by moderatorrater · · Score: 4, Insightful

      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.

      Expressing interesting things doesn't happen in a CS course, at least the ones where you're learning the language. It takes new CS students hours to implement the most simple linked list because it's not familiar to them. I learned low level first and I'm finding that it's the best way to teach my sister-in-law who's a beginning CS student. They're trying to teach object oriented features before they teach arrays or loops. Objects are constructs on top of the other programming concepts and should be taught as such. It was only after showing her how to use low-level features that she was able to start doing any semblance of OO programming.

      People get so caught up trying to teach the "right" way to program that they don't teach how to program first, which is a mistake. Students need to learn the power and wonder of while, for, and regular functions before you can teach them the power of object oriented programming. Computer science is unfamiliar and strange, let students learn the simple things before throwing the advanced concepts at them.

      I guess what I'm saying is that a good course would teach functional programming before teaching object oriented programming later in the same course.

    28. Re:Mine was certainly cruel to us by blair1q · · Score: 1

      Here's the answer:

      Tell them, "Pointers turn memory into one big array."

      Then let them figure out how to use an array.

    29. Re:Mine was certainly cruel to us by 91degrees · · Score: 2, Interesting

      I've frequently toyed with a low level C-like language (maybe a hacked version of an existing C implementation) that supports these. Integers would behave as structures so you could access my_int.carry as though carry was a boolean member. I have a problem with what to do when passing an integer as a parameter though. 1D and 2D Vectors as built in types seems like a fairly obvious extension. I'd also want to do bitwise casts and built in ability to separate the mantissa and exponent from floats. Never has got past the "wouldn't it be good if..." stage though.

      I thought C had support for atomic operations. Am I wrong there?

    30. Re:Mine was certainly cruel to us by TimSSG · · Score: 1

      Look, any programming tool requiring 50M of virtual memory to run Hello World is just wrong. And don't say peep about memory being cheap and such -- I'm talking wrong on general principle. Morally wrong.

      Finally, a possible cause of global warming I can fight against. Note: using all the extra memory must increase the temperature of the computer; I know it is likely too small to measure, but so what. Tim S

    31. Re:Mine was certainly cruel to us by 0xABADC0DA · · Score: 5, Insightful

      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):

      Somebody quoting Stroustrup on the topic of computer languages... seriously? C++ is like legalese -- it's impenetrable to read, full of unintended consequences, and even though it's spelled out in excruciating detail what it says is still open to interpretation.

      Not only is C the first subset of C++ that programmers should learn, it is the only subset of C++ they should learn.

      And I argue that C actually teaches people more about object-oriented that most other languages, because it teaches them in no uncertain terms why you should use objects. It's harder to realize why you don't just make fields public until you've seen global variables in a C program.

      Then Java teaches you how to do OO where you are not allowed to 'cheat' by replacing methods at runtime, or calling methods that don't exist, etc. And JavaScript takes all that and gives you LISP power.

    32. Re:Mine was certainly cruel to us by TheRaven64 · · Score: 4, Insightful
      Java makes a terrible teaching language for a number of reasons.
      • It isn't a good language for teaching object-orientation because it isn't a pure OO language so you have to understand the difference between objects and intrinsics.
      • It isn't a good introduction to programming, because you need a fairly complex program a class with a static method) for hello world.
      • It isn't a good introduction to data structures because all objects are references and all intrinsics are not, making aliasing difficult to teach.
      • It isn't a good introduction to computer memory, since it adopts the Smalltalk memory model which hides almost everything from the programmer (great for using, bad for teaching).

      There are lots of other reasons that I am too lazy to list here. Learning Java is not bad, but learning it as a first language does not make your life easy. A good introduction to programming course should cover half a dozen languages, as case studies, rather than attempting to use one to teach all of programming.

      --
      I am TheRaven on Soylent News
    33. Re:Mine was certainly cruel to us by OrangeTide · · Score: 1

      Forcing you to use pointers toughens you up so you can be ready for the real world.

      Doing all your data structure classes in C would be like a boot camp for debugging. And it would be sink or swim, if you can't debug all your wild pointers in your simple trie before the due date then you fail.

      --
      “Common sense is not so common.” — Voltaire
    34. Re:Mine was certainly cruel to us by Garse+Janacek · · Score: 2, Insightful

      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!".

      If they can almost finish a degree and still be surprised when Java dies with a null reference, then the problem isn't that they were taught to program using Java, it's that they were taught Java very badly...

      --

      I am the man with no sig!

    35. Re:Mine was certainly cruel to us by OrangeTide · · Score: 1

      I'm guessing he thinks Perl is modern equivalent of BASIC. I think I agree with him that if you want to bother to teach beginner students a programming language that you should start with some scripting language. Perl, Python, Shell, Javascript, whatever. But that's not exactly a college level course for a computer science student. It's the kind of thing you'd have in an Intro to Unix Administration course, or possibly in a high school course on computer programming.

      If a person is going for CS they ought to already know how to program in some language, even if it's just Javascript. I don't really believe in actively dumping CS students into a intro programming class unless they are really behind the other students. They will have great difficulty in forming their thoughts around the concepts presented to them unless they understand things like variables and conditionals. Maybe I don't know what I'm talking about here, and they can pick that kind of stuff up in their algebra class, but I learned programming(BASIC) before algebra so those concepts were immediately obvious to me.

      --
      “Common sense is not so common.” — Voltaire
    36. Re:Mine was certainly cruel to us by DarkOx · · Score: 2, Interesting

      No C is a great teaching language if what you want is to teach the science of computing and how the machines do their work. You have to do some work with students in at the very least C and some Assembly if you want them to get an understanding of computer design and architecture. You don't have to do these things if you want to teach software engineering. They are different fields or at least different disciplines within a larger field, like an Oncologist is a type of medical doctor and so is an Endocrinologist but they have very different educational backgrounds after some shared fundamentals.

      --
      Repeal the 17th Amendment TODAY! Also Please Read http://www.gnu.org/philosophy/right-to-read.html
    37. Re:Mine was certainly cruel to us by OrangeTide · · Score: 3, Interesting

      I've done nothing but C (not even C++) programming for the last decade in various full time and consulting positions.

      Linux is all C and the job market for Linux kernel, driver and system developers has been pretty active for many years now. Using QNX and vxWorks is all C programming too (not counting the tiny bits of assembly you have to stick into your programs).

      This is why I think it's important that people learn some assembly language once they are past the basic syntax of C. They don't have to become experts in the assembly, but being able to write (and debug!) a few basic programs in some assembly would be a good experience. Like a hello world(one that calls the system call, and one that calls a puts function), string reverse and maybe a linked list bubble sort. If you can get those 3 done in assembly after you've been exposed to C, it should make pointers (and arrays) a lot easier to understand.

      I believe being able to debug is as important as being able to program.

      --
      “Common sense is not so common.” — Voltaire
    38. Re:Mine was certainly cruel to us by orclevegam · · Score: 1

      Yes, BASIC is more or less obsolete at this point, so might as well point them in the direction of something at least slightly useful, which is where Perl comes in. Assuming you're not talking a beginner level class, assembly would be the better choice to start with. I was assuming recommendations from the level of complete beginner to programming on through at least a medium level of experience. Once you've gone beyond medium level of course the language you pick is going to depend on what you're trying to do, and learning a new language should not be a problem as you should already have a grasp of all the basic concepts and most of the advanced ones as well.

      Javascript might not be a bad choice as well, although I'm a bit hesitant to recommend that over Perl for a complete beginner as some of the concepts (like prototypes) might put off a beginner, and the distinction between the various structures is a little less defined than it is in Perl, which once again might prove confusion to a beginner. Also, do you really want to try to explain the difference between =, ==, and ===, to a complete beginner?

      --
      Curiosity was framed, Ignorance killed the cat.
    39. Re:Mine was certainly cruel to us by Bloke+down+the+pub · · Score: 3, Funny

      C obsolete and pointless?

      It's certainly not pointerless!

      --
      It's true I tell you, feller at work's next door neighbour read it in the paper.
    40. Re:Mine was certainly cruel to us by OrangeTide · · Score: 1

      If the demand for CS graduates is low, then why bother recruiting them actively? No, I think the difference is that the home computer generation is already in the work force, and number of kids who have a passion from programming is substantially smaller now that home computers are dead. (I guess they've been dead for 15-20 years)

      I kind of wish there was a market for a simple programmable gadget. Some genius (or more than one) took the relatively useless gadget called the home computer and sold it to the masses on the promise that it could be used for education and gaming (and some even promised it was useful for business). Everyone wanted to do their taxes and accounting on their home computer, but almost nobody did it that way because it turns out the software didn't exist when the computer came out, and when it was released it was relatively expensive compared to the computer. People weren't suckers like they are now, and paying $80 for a pack of floppy disks didn't make a whole lot of sense to most people.

      VisiCalc - $200 (I think)
      Microsoft Word 1.0 - $195
      ExperLisp (Mac) - $495
      Ensemble (Mac) - $299

      --
      “Common sense is not so common.” — Voltaire
    41. Re:Mine was certainly cruel to us by orclevegam · · Score: 1

      D is everything C++ should have been. C++ was the rough draft of how OO should be implemented on top of C, D is the final product.

      --
      Curiosity was framed, Ignorance killed the cat.
    42. Re:Mine was certainly cruel to us by gerglion · · Score: 1

      This does assume that the students are exposed in some form or another to programming in middle/high school, which I feel can be a bit of a stretch. I haven't been out of of high school for *that* long (Class of '01) and my high school had programming classes, clubs, or anything. There was a single 'computer' course: typing. I had to go to college to learn to program. I suppose the argument could be made that those who really want to know can dabble in their spare time, but I know in my case that I had fairly limited access to computers for a large portion of my childhood, so this wasn't very possible.

      --
      I know you have come to kill me.
      Shoot, coward. You are only going to kill a man.
    43. Re:Mine was certainly cruel to us by Trixter · · Score: 1

      This shouldn't be surprising, or a joke -- C was intended from the very start to be a portable assembler. And it has been, wonderfully.

    44. Re:Mine was certainly cruel to us by ceoyoyo · · Score: 1

      Spoiled. I had a new system analysis and design instructor in... third year or so who decided we should all do his projects in Visual Basic because that's the only language he knew. Naturally, as hot shot C(++) programmers we didn't like that idea much. More so for those of us who like to toss in a little inline assembly.

    45. Re:Mine was certainly cruel to us by TheRaven64 · · Score: 1

      Integers would behave as structures so you could access my_int.carry as though carry was a boolean member

      This is very difficult to implement, since these flags are only available immediately after an operation. You would have to store them somewhere sensible. A better option is to throw an exception or call a handler on overflow. C1x has support for this.

      1D and 2D Vectors as built in types seems like a fairly obvious extension.

      I don't know of any hardware with support for 2D vectors. GCC actually has a very nice set of extensions for handling vectors (you declare a type with an __attribute__ specifying its width and then you can perform the same operations you would with scalars on it and they will be applied to all elements).

      I thought C had support for atomic operations. Am I wrong there?

      C has a type which is guaranteed to be atomic with respect to signals, but not with respect to threads (since C has no concept of threads as of C99) or other processes accessing shared memory segments. When you do something like i++ in C, it is typically compiled to load-increment-store operations. If another thread / process does a load-something-store after your load then only one of the loads will be committed to memory. Most CPUs have atomic operations that avoid this. On x86 you actually have an atomic load-add-store instruction, while on other architectures you generally have primitives like an atomic compare-and-swap or a load-and-reserve.

      --
      I am TheRaven on Soylent News
    46. Re:Mine was certainly cruel to us by Shotgun · · Score: 1

      You don't find C to be readable? That sounds to me like a personal coding style problem. It is no hard to read or maintain than the TCL, perl, Java or C++ programs that I have to work with.

      I still prefer my work in C for pure readability.

      --
      Aah, change is good. -- Rafiki
      Yeah, but it ain't easy. -- Simba
    47. Re:Mine was certainly cruel to us by TheSpoom · · Score: 1

      I dunno, after taking an architecture class and learning an assembly language, I really, really prefer C for most things. Assembly is much lower level.

      (And yes, I realize the parent was a joke.)

      --
      It's better to vote for what you want and not get it than to vote for what you don't want and get it.
      - E. Debs
    48. Re:Mine was certainly cruel to us by LeafOnTheWind · · Score: 1

      There are a number of universities that still teach it. I'm a CS major at Northwestern University - our intro CS class is Scheme and then most of the classes are either in C++ or C. Intro to Computer Systems (second year prereq for the degree) is taught with C, assembly, and even a little machine code.

      That said, I still use Java for competition coding.

    49. Re:Mine was certainly cruel to us by Cro+Magnon · · Score: 1

      I'm not familiar with TCL, and I disagree with you on Java, but saying C is more readable than Perl or C++ is like saying a turtle is faster than a snail.

      --
      Slow down, cowboy! It has been 4 hours since you last posted. You must wait another few hours.
    50. Re:Mine was certainly cruel to us by shutdown+-p+now · · Score: 2, Interesting

      And, regardless of what else you do, learn Haskell. You'll probably never actually use it, but that knowledge will be useful elsewhere; and, on top of that, you'll know what true elegance in programming language design is.

    51. Re:Mine was certainly cruel to us by DiegoBravo · · Score: 1

      While I agree that the complexity of the full C++ language and libraries is a valid issue, I don't understand why you preach going the C-way:

      > It's harder to realize why you don't just make fields public until you've seen global variables in a C program.

      Please... this way everyone should be first learning GW-BASIC or COMMODORE BASIC to understand and "feel" a lot of bad practices. That approach may be valid if people would have a lot of years to learn programing languages.

      Think other way... would you train a pilot to flight by first crashing its plane to "feel" the destruction? or a doctor by using medieval techniques to grasp why he should use anesthesia?

    52. Re:Mine was certainly cruel to us by AgentTim3 · · Score: 1

      People get so caught up trying to teach the "right" way to program that they don't teach how to program first, which is a mistake. Students need to learn the power and wonder of while, for, and regular functions before you can teach them the power of object oriented programming. Computer science is unfamiliar and strange, let students learn the simple things before throwing the advanced concepts at them.

      You make a good point here, I would add that we should be teaching basic programming like this in high school and doing a better job of preparing students for university. This is already done in certain areas with Advanced Placement classes that offer college credit. Students that come into university without these fundamentals should expect at least a five-year Bachelor's degree program, with the first year spent focusing on the basics. Trying to cram everything into four years when you're starting from zero makes the C.S. degree extremely difficult for students that went to inadequate high schools.

    53. Re:Mine was certainly cruel to us by Thaelon · · Score: 1

      It isn't a good language for teaching object-orientation because it isn't a pure OO language so you have to understand the difference between objects and intrinsics.

      I would argue that any language that is pure OO is a huge PITA. Having a language that contains primitives provides a teacher an easy opportunity to illustrate the difference between objects and primitives. Simply compare

      Integer

      (object) to

      int

      (primitive). Then you can show them (in binary, hex, or decimal) the value of a primitive vs. the value of a pointer.

      It isn't a good introduction to programming, because you need a fairly complex program a class with a static method) for hello world.

      Really?

      public class HelloWorld {
          public static void main(String[] args) {
              System.out.println("Hello World.");
          }
      }

      Compare to C:

      #include <stdio.h>
      int main() {
          printf ("Hello World!\n");
          return 0;
      }

      You could say that the java version is verbose, but I would say the C version is terse. In terms of complexity, I would say the C version is slightly more so. Java has the class declaration, but C has the preprocessor directive. However, the C version requires a return value, Java does not. It's not a big difference, but at worst they're about the same.

      And the C++ version is the most bizzare looking to a beginner:

      #include <iostream>
      using namespace std;
       
      int main(int argc, char *argv[]) {
          cout << "Hello World !!!" << endl;
          return 0;
      }

      #include? namespace? iostream? *arv[]? <<? That is some cryptic stuff for the uninitiated.

      It isn't a good introduction to data structures because all objects are references and all intrinsics are not, making aliasing difficult to teach.

      How does that have an effect on data structures? Data structures are all about using the right one for the job. How the objects or pointers you put in them work are a bit tangential to the topic.

      It isn't a good introduction to computer memory, since it adopts the Smalltalk memory model which hides almost everything from the programmer (great for using, bad for teaching).

      I'll have to concede here, because it does hide just about everything, but the fact that you have to declare everything, and then make an explicit new call should provide hints. And as I said, this issue is why any programmer should have some experience with C/C++ and assembler to flesh out the abstractions Java provides.

      And for teaching algorithmic design, it's nice not to have all thsoe cryptic symbols that C and C++ use.

      --

      Question everything

    54. Re:Mine was certainly cruel to us by ArsonSmith · · Score: 1

      Can you change that to a car analogy?

      --
      Paying taxes to buy civilization is like paying a hooker to buy love.
    55. Re:Mine was certainly cruel to us by noidentity · · Score: 1

      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!".

      Java is great. Depending on the object type, you either get a pointer or a value, so you have to know how both work AND pay close attention to the object type to know which it is. And don't bother trying to pass user types as values or getting a pointer to a fundamental type, because you can't. It's like they wrapped the worst of pointers/values/operator overloading and made it invisible.

    56. Re:Mine was certainly cruel to us by fugue · · Score: 1

      Having taught a few different subsets of C and C++ and Java and a couple of other things, it is my considered opinion that while Stroustrup's quotation is reasonable, C++ is a terrible language for teaching programming. What's needed is something with a simple syntax. C++ can have that if the programmer is disciplined, which means that C++ would be a passable learning language for teaching expert, disciplined programmers. Useful.

      C++: an octopus made by nailing extra legs onto a dog.

      All the people I know whose first language was C++ get mired in syntax and can't write pseudocode or explain an algorithm. Those who continue for long enough can become good, but it does take some profound re-education.

      Next time I teach, it'll be in FLOOP.

      --
      "The biggest problem with communication is the illusion that it has taken place."
    57. Re:Mine was certainly cruel to us by TheRaven64 · · Score: 1

      You seem to be under the impression that I regard C or (worse) C++ as a good teaching language. I'm not really sure how you arrived at this conclusion.

      --
      I am TheRaven on Soylent News
    58. Re:Mine was certainly cruel to us by TheRaven64 · · Score: 3, Interesting

      Smalltalk (or, Self), Haskell, Lisp, Prolog and Erlang are all languages that fit into the 'learning these will make you a better programmer even if you never use them' category. I'd also through an assembly language (pretty much any one will do, although if you learn B5000 asm you will develop a passionate hatred for all modern architectures) in that pile.

      --
      I am TheRaven on Soylent News
    59. Re:Mine was certainly cruel to us by Woy · · Score: 1

      If that was not the case, it would probably not hold the speed crown after all this time.

      --
      "If God created us in his own image we have more than reciprocated." - Voltaire
    60. Re:Mine was certainly cruel to us by Larryish · · Score: 1

      Sorry, you lost me at "like".

      Can I get a car analogy?

    61. Re:Mine was certainly cruel to us by 32771 · · Score: 1

      While C is close to the metal, just try programming in ia64 assembly and implement a filter using loop unrolling and use all the 128 registers you have available (I never had to do this). C at least offers you the potential of doing this for you, depending on the Compiler.

      That whole register scheduling business can become a major pain even if you only deal with 32 registers, I'm glad that there is C doing this for me.

      With that C becomes much more readable and maintainable than assembly.

      --
      Je me souviens.
    62. Re:Mine was certainly cruel to us by adisakp · · Score: 1

      Vector and Atomic operations are provided as instrinsics on most modern C compilers. They are still CPU specific (i.e. x86 has cmpxchg while PPC has lwarx/stwcx). However, they usually compile into a single (or very few) assembler operations per intrinsic. The theoretical benefit of intrinsics is that the compiler can reorder and optimize them much more easily than inline asm.

    63. Re:Mine was certainly cruel to us by OrangeTide · · Score: 1

      If a person has graduated high school post-2005 and wants to be CS. I think we should just assume they have tried to make JavaScript webpages or Flash ActiveScript or something. Computer usage is mainstream with the kids now, unlike when I got into BASIC and Pascal. It seems like most kids have their own computer, and all of them have email and instant messaging. The ones interested enough to pursue CS seem to have a lot more.

      My high school offered two levels BASIC programming and one of Pascal, for the mid-90s they were way ahead of the curve I think. (small school graduating class was around 80 students, iirc) I kind of wish all high schools could afford to offer programming classes, but you don't have to learn how to program in a classroom setting. And mostly these classes were just a way for you to allocate lab time to learn on your own.

      --
      “Common sense is not so common.” — Voltaire
    64. Re:Mine was certainly cruel to us by DiegoBravo · · Score: 1

      I don't know nor ever used D, but from http://en.wikipedia.org/wiki/D_programming_language it doesn't look as the "final product":

      "The standard library in D is called Phobos. Some members of the D community think Phobos is too simplistic and that it has numerous quirks and other issues, and a replacement of the library called Tango was written.[4] However, in the D 1.0 branch, Tango and Phobos are incompatible due to different runtime libraries (the garbage collector, threading support, etc). The existence of two libraries, both widely in use, has led to significant problems where some packages use Phobos and others use Tango."

      May you elaborate about that? open source implementation? Please note I'm not ranting against D, just desiring to learn.

    65. Re:Mine was certainly cruel to us by orclevegam · · Score: 1

      The language itself, the syntax and such is fairly good, but as the wikipedia article points out the standard libraries are a little fubar right now. Tango was built as a replacement for Phobos, but because they use different APIs, an application (and worse, a library) written for Tango won't run on Phobos and vice versa. The goal of D was to create a language with all the benefits of Java/C#/Python and other high level OO languages, but with the ability to compile to a native binary so the language could be used to write drivers and to do embedded development. The language is compatible with C and you can link against and use C libraries, although as you might expect a little bit of foresight needs to be used when passing variables to and from C libraries due to the garbage collection mechanism that D provides (you can opt to manually do garbage collection which is necessary in some cases).

      From a syntax perspective D looks most like C# I think, although there are differences and some parts look more like Java. There's work being done right now with D 2.0 to unify Tango and Phobos and clean up the standard library in general, but as far as the syntax of the actual language goes it's one of the best I've seen.

      --
      Curiosity was framed, Ignorance killed the cat.
    66. Re:Mine was certainly cruel to us by ivan256 · · Score: 2, Insightful

      It's harder to realize why you don't just make fields public until you've seen global variables in a C program.

      That's an interesting statement, considering the set of reasons you shouldn't use global variables only slightly overlaps with the set of reasons you shouldn't make your object attributes public. Additionally, in introductory CS classes (anything in the first year), it's not obvious to the student at all why you shouldn't use global variables. Early C students learn about scoping, are told that it is important to avoid the global scope, and are taught *how* to avoid the global scope, but it isn't until you start to learn higher level computer science and basic level software engineering concepts that it starts to become clear why you avoid the global scope.

      It is important that C teaches you why you should use objects, but it is equally important that C teaches you why you shouldn't (though arguably there are other, better languages for teaching the latter). A good software engineer has learned that there is a time and place for both object oriented solutions and procedural solutions. The worst engineers I've ever worked with have insisted that one of the two methodologies was always the answer.

    67. Re:Mine was certainly cruel to us by Kadin2048 · · Score: 1

      This is all true, but I suspect that the number of programmer-hours (which is not a good metric of productivity, but it's a pretty good metric of employment) spent writing shrinkwrapped software is dwarfed by the number of hours spent writing custom code for hire.

      I don't know if it's still true anymore, but at one point while I was in school, it was taken as established fact that there were more unique programs written in COBOL* than anything else, because of all the stuff that had been written for businesses and the DOD. There's only one Microsoft Excel, but there are thousands of different custom General Ledger systems, and each one needed to be spec'd, designed, and implemented by a team of programmers and analysts.

      So while CS undergrads may envision themselves graduating and working on software that's sold by the millions of copies and used by billions, it's much more likely that they'll end up writing code that's sold exactly once and used by a few dozen or hundred people.

      With that as a premise, if (and I'm just saying if) there are some languages that tend towards Microsoftian write-once-sell-forever software, and some languages that tend towards software-as-consulting, custom business logic, most undergrads would be well-advised to learn the latter if their goal is steady and comfortable employment.

      * As unique as a COBOL program gets, of course. ;)

      --
      "Ladies and gentlemen, my killbot features Lotus Notes and a machine gun. It is the finest available."
    68. Re:Mine was certainly cruel to us by eabrek · · Score: 1

      The parser is true open source (the reference compiler is free as in beer). gdc is the GPL project that uses that to interface to the gcc back end for generating code.

      Phobos is free as in beer. Tango is true open source (IIRC).

    69. Re:Mine was certainly cruel to us by FormOfActionBanana · · Score: 1

      Pointers make routes into one big array of destinations.

      Then let them figure out how to drive.

      --
      Take off every 'sig' !!
    70. Re:Mine was certainly cruel to us by lennier · · Score: 1

      "A good software engineer has learned that there is a time and place for both object oriented solutions and procedural solutions."

      That's a very depressing sentence. 'Object oriented' and 'procedural' are the two paradigms? That's like saying 'I like both kinds of music, country and western'.

      Where does, eg, functional programming get a look in? 50 years of Lisp and lambda calulus... anything?

      How about combinatory logic and concatenative languages?

      How about logic programming? Does anyone now even *remember* what Prolog was? It only had the potential to revolutionise the software industry, and it had nearly zero impedance mismatch with relational databases; but we ignored it. Now it's been censored from history like it never existed.

      What about dataflow and flow-based programming?

      One of my deep annoyances with object oriented programming (after the fact that it's so vaguely specified that even the top OOP advocates *disagree* publically on what its fundamental axioms are - Smalltalk and Java are about as far away from each other as you can get, and Io and Javascript don't have much in common either, and don't even get me started on Liskov Substitutability and how easily that's subverted by runtime reflection) - is that it's built entirely on the *procedural* paradigm.

      OOP emerged from the Lisp world, then spent most of its lifetime doing its best to *abandon* everything Lisp taught us, and reformulate itself on top of Algol.

      That was a huge mistake which we're still paying for, and I blame C++ for taking us headlong down that dead-end path.

      If we're going to do 'objects', we should at least have the decency to build them on top of functional programming. But it will probably take another 50 years before we realise that.

      --
      You are not a brain: http://books.google.com/books?id=2oV61CeDx-YC
    71. Re:Mine was certainly cruel to us by jonwil · · Score: 1

      Java is popular because A.Employers who are likely to employ new graduates are looking for it (more so than C and C++ these days) and B.Java hides or eliminates most of the complexity seen in C and C++ (pointers etc).

    72. Re:Mine was certainly cruel to us by DiegoBravo · · Score: 1

      Thanks.. this sounds a bit like the Kde and Gnome "options" that mislead a lot of Linux developers, but in the right way to be solved. BTW, D is not in standard Ubuntu repositories, but I've found this:

      http://www.plasticboy.de/2007/11/03/installing-gdc-for-the-d-programming-language-the-ubuntu-way/

      Maybe I'll try it one of these days.

    73. Re:Mine was certainly cruel to us by Anonymous Coward · · Score: 0

      history rantOOP emerged from the Lisp world, then spent most of its lifetime doing its best to *abandon* everything Lisp taught us, and reformulate itself on top of Algol.

      If you want to wax nostalgic about CS history you should at least know that the first recognizably object oriented programming language was Simula 67 (not LISP, definitely not Smalltalk). And if you compare Simula 67 to Java you see a lot of 'simularities', like inner classes for instance.

    74. Re:Mine was certainly cruel to us by nuttycom · · Score: 1

      Now that I'm in the process of learning Scala, I wish I'd learned Lisp first. I started with Perl.

      In my opinion, a good computer science curriculum would include a brief introduction to imperative programming (because it's simple to grasp) then move into a more in-depth treatment of functional programming, and finish up with an overview of OOP. OOP is nice, but to really make programs modular and the different parts of the program independent and idempotent requires a more functional style.

      Going straight to OOP from imperative programming is a recipe for learning to build hard-to-maintain systems with all kinds of weird side effects.

    75. Re:Mine was certainly cruel to us by Anonymous Coward · · Score: 0

      I agree. I taught C++ from day one without using C and showed later that part of C++ contains C like code.
      I finished a book but did not pursue to publish it. CS professors are, in general, myopic and have done more harm to students and Industries. That is why we have to send our coding industry to outside US.

      Anoymous Coward

    76. Re:Mine was certainly cruel to us by Anonymous Coward · · Score: 0

      You, and Stroustrop, forget that the devil is in those "technical difficulties" and "low-level details".

      I think Assembly is actually a great way to learn programming, because that is as close as you'll ever get to seeing how a computer actually thinks. You might think, like Stevens, that a computer thinks in C, strings, and command lines, but you'd be mistaken. It thinks in machine words and opcodes, no matter how high-level a language you use, in the end it all boils down to words and opcodes. So assembler strips out all the metaphors, all the short-hands that compilers and language designers enjoy, and leaves you with the only distinction a computer honors: data and program text.

      There are practical considerations, too. First, Assembler rigidly enforces the directive about making sure code is correct before optimizing. You don't have to worry about stack space until you start doing functions, and once you do recursing until you run out of stack space) becomes much less likely (and before you say, memory is cheap and there's nothing wrong with recursion, try writing a kernel).

      The big problem with "Computer Scientists" and the languages they spawn is that they spend all their time and effort worrying about Turing machines, which don't exist and never will. You can have all the wonderful recursive, functional language environments and virtual machines you want for toys, but when you want to do something useful, like opening a socket or writing to a disk, you have to stop calling functions and start calling procedures.

      Face it: all the interesting parts of C++, Java, C#, perl, and whatever other high-level language you care to name are implemented in C, either using the C library or the C interface to the system calls.

      Like Peter S. Beagle's advisor used to say, you have to go by way of Sandusky sometime.

    77. Re:Mine was certainly cruel to us by Anonymous Coward · · Score: 0

      On the other hand, you can learn C just to learn C, which makes sense since C++ is such an horrible language.

      And wanting to write descent C++ without a deep knowledge of C is, well, interesting. The result is likely to be interesting too :P

    78. Re:Mine was certainly cruel to us by 91degrees · · Score: 1

      This is very difficult to implement, since these flags are only available immediately after an operation. You would have to store them somewhere sensible.

      It's an optimisation issue. Normally the carry flag won't be used. But this is an issue for parameter passing. There's no way of knowing whether a function or a caller will need to know about the flag. Handlers are too expensive for most uses. I want to be able to write something like hibits = hibits+lowbits.carry;

      I don't know of any hardware with support for 2D vectors.

      I know the Sony PSP vector unit can handle register sets in groups of 16 arranged in grids of 4x4 although can't remember the details. I'm sure it's not unique in that respect. But built-in support for matrix operations would be a useful feature and doesn't need explicit support from the hardware.

    79. Re:Mine was certainly cruel to us by jnork · · Score: 1

      C - all the power and flexibility of assembly language combined with the readability and maintainability of assembly language.

      Ah, personally I have to disagree. C is a medium-level language, which means it's closer to the machine than something like Pascal or ADA, but it's not assembly.

      I've done a LOT of assembly-language programming on microprocessors and microcontrollers, as well as C, C++, and Pascal, and C is much different from assembly.

      That is, of course, MHO.

      BTW I'm one of those weird people who actually likes programming in assembly. :)

      Not always, though. Sometimes using a higher-level language just makes more sense. It's just that I also do lots of firmware, so I'm already working down next to the bare metal.

      --
      Cleverly disguised as a responsible adult.
    80. Re:Mine was certainly cruel to us by xenocide2 · · Score: 1

      BTW, D is not in standard Ubuntu repositories, but I've found this:

      Umm, yes it is.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    81. Re:Mine was certainly cruel to us by TheRaven64 · · Score: 1

      It's an optimisation issue. Normally the carry flag won't be used.

      No, it isn't. It's an expressiveness issue. Consider:

      a = b * c + d;

      One of the intermediate values here causes an overflow. If it's the multiplication, where does the carry flag get set? It will be cleared in the addition and the temporary is discarded.

      I've worked on code generation in a C compiler and looked at this exact issue. There is no good way of doing it in the general case. It would be better to create multiply(), add(), and so on intrinsics that return the carry flag in a boolean and optimise it away to a conditional branch. The way C1x does it is very nice too - map integer overflows to something similar to a signal, so you can handle them as the occur.

      --
      I am TheRaven on Soylent News
    82. Re:Mine was certainly cruel to us by 91degrees · · Score: 1

      Hadn't thought of that one. And there are all sorts of other issues that could be thrown up if the carry flag is already set.

      Still convinced there's a solution. Just don't know what.

    83. Re:Mine was certainly cruel to us by DiegoBravo · · Score: 1

      You're right... silly me for not searching correctly.

    84. Re:Mine was certainly cruel to us by ivan256 · · Score: 1

      No, they aren't the two paradigms. They are two paradigms.

      The sad thing is that I anticipated your response when I edited functional programming out of that sentence for simplicity, but still decided to omit it, because all it would accomplish is for somebody like you to pick the next methodology down the list...

      I think the saying "missing the forest through the trees" applies here.

    85. Re:Mine was certainly cruel to us by ukyoCE · · Score: 1

      And I argue that C actually teaches people more about object-oriented that most other languages, because it teaches them in no uncertain terms why you should use objects. It's harder to realize why you don't just make fields public until you've seen global variables in a C program

      IMO you can learn most of OOP just by doing C in an object oriented fashion. For all the breathless talk of OOP, most Java and C++/C# programs end up coming down to Structs and Namespaced Functions. If inheritance, polymorphism, or interfaces are used it's typically in the underlying libraries, not within the new code.

      And Java programmers in particular love using Singletons, which are effectively a global struct with functions namespaced to it.

      So you can learn bad programming in any language, and likewise you can learn good programming, even OOP, from any language. Just saying "oh, teach him Java" doesn't mean he'll actually have the remotest clue about object oriented design when he's done.

    86. Re:Mine was certainly cruel to us by hazem · · Score: 1

      If the demand for CS graduates is low, then why bother recruiting them actively?

      By that logic, schools wouldn't recruit English majors, Anthropology majors, Philosophy majors and "General Studies", etc.

      The sad truth is that the only part of the university that cares about what happens to the student after they graduate is the development office (they're the ones who'll hound the graduate for donations for the rest of their lives).

      The rest of the school's purpose is to get tuition-paying students into their seats and make money. So that's why they'll recruit students into programs that have few prospects for the graduates. And if they have to dumb down the program to get the students to stay, and thus diminishing the prospects of their graduates at the same time, then so be it.

      That's not to say that individual professors act this way, but the university is an organism itself and will often do things contrary to the wishes of the people who comprise it.

    87. Re:Mine was certainly cruel to us by hazem · · Score: 1

      Pointers make routes into one big array of destinations.
      Then let them figure out how to drive.

      So then pointers are more like a series of tubes rather than a bunch of dump trucks?

    88. Re:Mine was certainly cruel to us by acheron12 · · Score: 1

      C++ - all the power and flexibility of assembly language combined with the readability and maintainability of assembly language with classes.

      (Although some of those boost.org libraries make it look surprisingly like Python.)

      --
      there is no god but truth, and reality is its prophet
    89. Re:Mine was certainly cruel to us by OrangeTide · · Score: 1

      Fair enough, that the behavior of universities is fairly disconnected from reality is something I'll readily accept (wrt recruiting lots of people who may not have a career path outside of the university). And while it is disappointed to hear, I think it is probably true that universities don't have the interests of students as a high priority.
      Sometimes professors don't have much choice in how things work out, it can be hard for one person to fight a massive system composed of possibly hundreds of administrators.

      --
      “Common sense is not so common.” — Voltaire
  3. Difficulty by nitsnipe · · Score: 1

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

    1. Re:Difficulty by Anonymous Coward · · Score: 0

      DIKE-stra

      Now, piss off, sonny. Back to your gamecube!

  4. Hmmm... by Phasma+Felis · · Score: 0, Troll

    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.

    1. Re:Hmmm... by ExtraT · · Score: 4, Insightful

      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?

    2. Re:Hmmm... by ZeroExistenZ · · Score: 4, Funny

      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");

      --
      I think we can keep recursing like this until someone returns 1
    3. Re:Hmmm... by fbjon · · Score: 4, Insightful

      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.

      --
      True confidence comes not from realising you are as good as your peers, but that your peers are as bad as you are.
    4. Re:Hmmm... by 16384 · · Score: 5, Funny

      cat > hello.c
      printf("hello world");
      ^D
      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'

    5. Re:Hmmm... by RobKow · · Score: 5, Insightful

      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.

    6. Re:Hmmm... by phasm42 · · Score: 0

      Line of code != Compilable program

      --
      "No one likes working in a hamster wheel, and your shop smells of cedar shavings from here." - TaleSpinner
    7. Re:Hmmm... by danieltdp · · Score: 1

      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.

      --
      -- dnl
    8. Re:Hmmm... by wilder_card · · Score: 1

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

    9. Re:Hmmm... by DarenN · · Score: 4, Interesting

      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
      System.out.println("output");
      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 :)

      --
      Rational thought is the only true freedom
    10. Re:Hmmm... by amorsen · · Score: 4, Insightful

      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.

      --
      Finally! A year of moderation! Ready for 2019?
    11. Re:Hmmm... by MadnessASAP · · Score: 3, Interesting

      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.

      --
      I may agree with what you say, but I will defend to the death your right to face the consequences of saying it.
    12. Re:Hmmm... by Anonymous Coward · · Score: 0

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

    13. Re:Hmmm... by hey! · · Score: 1

      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.

      --
      Post may contain irony: discontinue use if experiencing mood swings, nausea or elevated blood pressure.
    14. Re:Hmmm... by camperdave · · Score: 2, Insightful

      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.

      --
      When our name is on the back of your car, we're behind you all the way!
    15. Re:Hmmm... by swordgeek · · Score: 5, Interesting

      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?

      --

      "People who do stupid things with hazardous materials often die." -- Jim Davidson on alt.folklore.urban
    16. Re:Hmmm... by mhesd · · Score: 5, Informative

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

    17. Re:Hmmm... by doti · · Score: 4, Insightful

      you serious?

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

      --
      factor 966971: 966971
    18. Re:Hmmm... by Anonymous Coward · · Score: 0

      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.

    19. Re:Hmmm... by argiedot · · Score: 2, Interesting

      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.

    20. Re:Hmmm... by blueg3 · · Score: 1

      Most people should be so lucky as to have your "problem". Programming is easy to learn. People who learn to program and learn no theory should not be computer scientists and should not get a degree in computer science. People who learn the theory should be able to easily pick up an arbitrary programming language and produce sound code in it.

      The real problem with theory-free code monkeys is that they rarely actually understand what they're doing, and they rarely know a solid approach to a given problem. They can churn out lines of code that perform simple, straightforward tasks. Not very useful.

    21. Re:Hmmm... by Anonymous Coward · · Score: 0

      Except, most universities have a seperate program for Software Engineering. Now you might ask what the purpose of computer science is then and you could compare it to psychology. Preperation for Graduate school.

    22. Re:Hmmm... by aug24 · · Score: 1

      You are exactly wrong (IMO, of course).

      In C++ (for example), the output just comes out on the screen. That's 'magic'. In Java, it is explicit that there is somewhere for the output to go that is not necessarily a terminal/command prompt/bash shell. The fact that learner Java programmers are told that it will be explained later is better than the average C++ class where it is not clear that there is something to explain at all.

      Justin.

      --
      You're only jealous cos the little penguins are talking to me.
    23. Re:Hmmm... by ShieldW0lf · · Score: 1

      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.

      Totally agree. I spent my childhood typing assembly games out of the back of Compute! and POKEing memory registers in my programs, and it really gives you a grasp of how what you're doing connects to the real world, even if you hardly ever use it professionally.

      --
      -1 Uncomfortable Truth
    24. Re:Hmmm... by RingDev · · Score: 1

      System.out.println("output");

      System is a namespace
      out is a print stream object
      println is a function the outputs a line to the console
      "output" is a parameter

      done.

      cout "output" endl;

      cout is a predefined ostream that outputs to the console
        if the write operator
      "output" is a value
      endl is a keyword the represents and end of line character

      done.

      Now, this is just personal tastes, but "out.PrintLn()" makes a whole lot more sense than "cout " which requires you to accept the 'magic' of the operator.

      The memory side of things you have a point. But how many people are writing code that they have to manage their own memory? Almost everything at this point is either managed code with garbage collection built in, or there are toolsets you can use to manage memory for you. Are you ever going to send a consultant out and let them bill a customer for the time it takes to write memory management code when they could just use and off the shelf option? (**with very few exceptions)

      If you are going to a university aiming for a computer Science degree, then yeah, starting off with lower level languages is a must. If you are going to a tech school for a Computer science degree, then starting off with lower level languages is a waste.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    25. Re:Hmmm... by plasticsquirrel · · Score: 1

      And you give an example of how students should program, in C++? That's is the exact sort of language a student should not be learning first -- an overly-complicated, inconsistent hybrid language with a terrible object system. Say what you will about Java, but it's fairly consistent, portable, and closer to a pure OO language.

      But personally, I'd rather see introductory programming courses taught in Python or Scheme. Those languages are small enough that students can focus on program design without being encumbered by syntax and semantics.

      --
      Systemd: the PulseAudio of init systems
    26. Re:Hmmm... by Anonymous Coward · · Score: 0

      I disagree. An undergraduate physics or chemistry degree does NOT qualify you to do research; at best, it qualifies you to be a laboratory technician.

      Similarly, a bachelor's degree in computer science qualifies you to become a professional programmer. If you want to do research, you can learn how to do that in a Ph.D program. If you want to be a bit more impressive as a professional programmer, you can go for an M.S. (this is also good preparation for a Ph.D).

      I think you need to think this point of view through.

    27. Re:Hmmm... by Renegade+Iconoclast · · Score: 1

      Erm...

      Where do I start?

      First off, what is wrong with, "System is the system library, Out is a function in that library, and it prints to the console."??

      Secondly, even in a garbage collected language, you can't just go around doing whatever you want, if you want to have an application that performs well. Algorithms are still quite important, and remain the primary form of optimization.

      I know I will catch some flak for saying this, but non-garbage collected languages will soon be relegated to a COBOL-like existence. The fact is that languages like Java and the .Net languages are becoming "fast enough," now. Try out XNA sometime, if you don't believe me. So you're trying to convince me that I should like taking the garbage to the dump myself every day. What I want to do is work out a reasonable relationship with the garbage man.

    28. Re:Hmmm... by ELProphet · · Score: 1

      "
      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
      System.out.println("output");
      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".
      "

      I think both have an equal amount of hand-waving.

      System is a class that contains many useful run-time features your program can use. The out property is a way to write to the console. The println method of the System.out reference is a way to write text or other objects to the standard out, with an appended new line. If it gets passed an object, it calls the object's toString method first, giving each object control over how to display itself

      The is an operator that is overloaded by many classes. The cout overloads the operator to print to standard out. The cout itself requires a bit of hand waving. Also, you need to return an int from the main (Why? Don't worry, just return 0), you need to import a namespace, and you need to explain that endl is a magic (but platform independent) line terminator.

      Guess what? There is no good language to teach computer science in. They all require a lot of hand-waving for the intro programmer. The college I go to is shifting very heavily to not using any language in the first semester of the CS program. It's entirely flowcharting and basic UML- design first. 2nd semester is Java, 3rd semester is Data Structures (using JCF). 4th semester is C and Assembler. Junior and Senior years are electives, including Architecture, Distributed, Networking, Graphics, OSes, and Compilers. Also required is an internship.

      A great programmer doesn't give a rats ass about what language they're programming in. A great programmer will program into the language, using the language to the best of its ability. A great programmer will, however, choose languages and environments that give them their greatest desire: the ability to be lazy. Good CS programs will teach people how to program, not what to program. Good professors must find a way to present all aspects of CS in an appropriate fashion, and that does mean design first.

    29. Re:Hmmm... by PitaBred · · Score: 1

      I had an instructor in college who was a brilliant algorithmist. Could come up with a working, efficient algorithm for anything, and he'd do it quickly. If we implemented the algorithm, the code would always work great.

      His Win98 box on his desk was the most virus-infested machine I have ever seen.

      I still consider him a great computer scientist... just not a great operator. But going for the requisite car analogy, I'll bet most race car drivers don't know all the physics and metallurgy needed to build a car, even if they might be able to put the parts of an engine in the right place. That doesn't mean that the engineer is a useless reference, it just means you shouldn't go to him for racing tips.

    30. Re:Hmmm... by edwinolson · · Score: 5, Insightful

      I find it ironic that, to establish your argument that Java hides implementation details, you used a C++ example employing operator overloading such that the mere existence of functions is utterly concealed.

    31. Re:Hmmm... by ciggieposeur · · Score: 1

      For instance, to simply output a line to a command line in Java you're looking at
      System.out.println("output");
      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".

      You're trading Java's (OO + packages) for C++'s (OO + operator overloading + namespaces). I don't see how that is any simpler.

    32. Re:Hmmm... by Anonymous Coward · · Score: 0

      Both examples require magic. You either ignore objects or you ignore operator overloading. The C++ example is actually worse and requires more handwaving because students are going to see function calls early on, but not operator overloading. The C++ code looks like magic. The java code looks like a function call.

    33. Re:Hmmm... by Anonymous Coward · · Score: 0

      If you ask me, cout, the overloaded left bit shift operator, and endl are oodles more magical and hard to explain to a beginner than System.out - you just have to take a day or two without any coding to explain the absolute basics of OO and then you can explain the Java version. To *really* be able to explain the c++ version would require many more days than this. Let's face it, if you want to get people programming right away, there will always be quite a bit of magic that you'll have to explain in more detail later. Hell, unless you start at the "this is how we make transistors out of doped silicon, and this is how transistors work" level, many things will be magical. It's easier and more efficient to take a hybrid top-down/bottom-up approach. You can't get straight to full understanding, you must circle in on it from many directions and help the students make the necessary connections.

    34. Re:Hmmm... by iwan-nl · · Score: 1

      So explaining operator overloading is much simpler than explaining the System class and its static members? Changing the meaning of the traditional bitshift operator to mean something completely different is a very bad and confusing idea IMO.

      --
      I'm trying to improve my English. Please correct me on any spelling/grammar errors in this post.
    35. Re:Hmmm... by nschubach · · Score: 1

      Not as sadistically cruel as my experience in college. Six, yes 6, semesters of COBOL/JCL/Mainframe... in a 9 semester Computer Information Systems Degree (which I dropped like a lead weight) I later found out from a friend that they tried to cram C programming in the last semester to cover some requirement.

      I keep telling myself that I left because the English literature teacher treated us like kindergartners by turning off the lights when she walked into the room and waited for everyone to be quiet or the Japanese Management class that everyone failed (yet somehow nobody actually did after the grades where published)... but I think It was really the COBOL that made the nightmares worse every night.

      --
      Every time I start to have faith in humanity, I ruin it by driving to work between 7 and 8 am.
    36. Re:Hmmm... by pm_rat_poison · · Score: 2

      University is supposed to make you a scientist. If the focus were on gaining practical, hand-on experience, your education would be outdated in just a few years, when the next best thing appeared. Not having the theoretical background, you would either become obsolete or forced to learn a new approach right from the start. After all, the best way to learn to code, is to code yourself. If you have the theoretical understanding, which progresses at a much slower pace than practice, it's much easier to adapt to a newer approach. That doesn't make it easy for the students, but, just as in mathematics, there is no royal path to knowledge.
      In summary, it's better to "learn how to learn" than to focus on one thing and become useless when this thing is replaced

    37. Re:Hmmm... by SparkleMotion88 · · Score: 1

      As a result, it tends to get waved away as "magic" or "this will be explained later"

      This "magic" is necessary no matter how you teach programming. Even if you teach assembly, there is still some amount of magic in how it is translated into machine language. If you teach machine language, then the way the computer interprets it will be magic. Hell, even if you build a computer out of relays (not recommended for "intro to programming" class), you still have to explain away the "magic" of magnetism.

      So you can't do away with magic, so I recommend you choose a suitable level of abstraction and start there. Remember, most programmers will be working on large applications, not low-level systems stuff. So the level of abstraction presented by Java is a great starting point. The students who are talented will then be able to expand the scope of their knowledge in any direction, as necessary.

    38. Re:Hmmm... by rrohbeck · · Score: 2, Funny

      Meh. Write-only Perl line noise.
      How can that be a real program without about 10 lines of module and class declarations around it?

    39. Re:Hmmm... by Otto · · Score: 1

      Now, this is just personal tastes, but "out.PrintLn()" makes a whole lot more sense than "cout " which requires you to accept the 'magic' of the operator.

      What "magic" are you referring to? cout is a special instance of the ostream object type. And a "stream" is relatively easy to understand, as it's an object that can take input and produces output using stream operators. In this case, cout is a special object with its output side hooked to the console. If you want to explain the console itself, then yes, you have to go lower level into memory addresses and such, but it is understandable by going lower into the system.

      The System.out.println is much more magical, as there is absolutely no explanation for how the println prints to the console. The "out" object is essentially undefined, and you have some magic happening in the java virtual machine that connects it to whatever the 'console' happens to be. But that "console" doesn't map to anything real. You can't go any lower level in the machine itself, because your code is not really running on that machine... Essentially, Java is far more magic than C++ because you have this black box called a "JVM" which is unexplained in its entirety.

      Of course, this depends on what you consider to be "magic".

      The memory side of things you have a point. But how many people are writing code that they have to manage their own memory? Almost everything at this point is either managed code with garbage collection built in, or there are toolsets you can use to manage memory for you.

      This depends on your target audience. Are you teaching basic business level programmers who will write high level code and websites? Or engineers who will write embedded code for lower level devices?

      Or, are you teaching "Computer Science", which is not fundamentally about programming at all, but is about ideas and concepts that back up computing? Because here is where you teach about how things like Memory Management and Garbage Collection actually work, and so yes, they do need to understand pointers, and how objects are created and destroyed and so forth.

      If you are going to a tech school for a Computer science degree, then starting off with lower level languages is a waste.

      What is a waste is calling anything taught at a tech school "Computer Science". Most of them call it something else, like "Programming" or "Computer Engineering" or even "Software Engineering". Not many call it CS any more.

      --
      - Give a man a fire and he's warm for a day, but set him on fire and he's warm for the rest of his life.
    40. Re:Hmmm... by frooddude · · Score: 1

      And the above comment of "Line of code != Compilable program" stands.

      perl is interpreted, not compiled.

    41. Re:Hmmm... by MikeBabcock · · Score: 1

      echo "hello world"

      --
      - Michael T. Babcock (Yes, I blog)
    42. Re:Hmmm... by Anonymous Coward · · Score: 0

      Both C++ and Java are languages which can be taught to beginner programmers, but they're certainly not languages for introducing students to computer science. If you want to use a real language (and Dijkstra argued that you should avoid that if at all possible), then you should start with a low level language like assembly. At this level the problems of computer science become apparent: The sheer complexity of the programs you're using daily, the raw speed of the machine and, most importantly, the limitations of its defining elements (CPU, memory). Modern high-level languages almost seem like magic to people who have never taken it upon themselves to learn how a computer actually works. This notion creates precisely the anthropomorphization for which Dijkstra proposed that students should be fined.

      (BTW, in my introductory computer science course we were taught a very limited theoretical language, almost exactly like Dijkstra proposed, proofs and all. This has not stopped me from becoming fluent in several real world programming languages. On the contrary, it has provided a solid foundation: It makes me ask myself how high-level languages do what they do, whereas I would otherwise probably just accept the "magic".)

    43. Re:Hmmm... by SparkleMotion88 · · Score: 1

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

      If I had to hazard a guess, I would say that a computer science undergraduate degree attempts to prepare you for graduate study AND a career in industry immediately after graduation. An undergraduate degree in math or hard science typically prepares you for graduate-level study only. This distinction is a necessary result of the large demand for programmers in industry -- schools needed to adjust to the expectations of students and the industry. Some programs will separate out these pursuits into different majors (e.g. software engineering vs computer science), but that doesn't change the fact that companies expect a person with a bachelor's degree in computer science to be able to write quality software.

    44. Re:Hmmm... by Cowmonaut · · Score: 1

      Weirdo.

      Seriously though, the way my mind works is fairly analytical (so I hear). I more easily compartmentalize and break things down. So looking at the C version its a lot easier to see what each segment is doing after only a brief explanation, or even less. For example "cout" makes sense because the language is C and its the OUTput.

      But to each their own.

    45. Re:Hmmm... by timothyf · · Score: 1

      My university actually teaches with a wide variety of programming languages. The beginning classes are in Java, but there are a required courses that use C, C++, Python, C#, Scheme, and a smattering of classes where they don't specify the language to use. And interestingly enough, for everything except Java, Scheme, and the memory management portion of C++, they expect the students to *gasp* learn most these languages almost completely on their own.

      I don't mind removing pointers from the introductory classes--they are hard for a beginning programmer with little experience to grasp, I'd say--, but removing them from the curriculum altogether seems like a really bad idea to me.

    46. Re:Hmmm... by michaelwv · · Score: 1
      IAAA and I completely agree with Dijkstra. The academic field of Computer Science is not about computers or being a kick-assembly coder. Just as English is not about composition, and Math is not about arithmetic. Part of the confusion in these discussions is that most of the people Computer Science departments tend to graduate go on to be software engineers and find themselves on /.

      FWIW, I'm an astronomer who spends most of his days writing code to analyze data taken by large complicated telescopes whose operation I understand but which I should never be asked to fix.

    47. Re:Hmmm... by Anonymous Coward · · Score: 0

      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
      System.out.println("output");
      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".

      Of course, explaining why they have to use << is all they ever need to know about streams.

      I guess I'm lucky, I started with

      PRINT "Hello world."
      RUN

    48. Re:Hmmm... by msuarezalvarez · · Score: 1

      You are up for the Useless Use of Cat Award this week...

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

    49. Re:Hmmm... by Anonymous Coward · · Score: 0

      What do you mean, just comes out on the screen. "cout" in C++ is exactly what "System.out" is in Java. Both objects exist "out of nowhere". In C++ you use an operator to write to the stream, in Java you invoke a method of the stream. (The C++ example has the added complexity of using the operator twice, which IMHO needs some explaining.)

      If you teach either of these languages before the students understand computers and programming on a much lower level, you get what you deserve. At that point it makes no difference that the students must learn the intricacies of memory management in C++ while it is (mostly) handled for them in Java.

    50. Re:Hmmm... by Garse+Janacek · · Score: 2

      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.

      I'm curious where you are finding these students. In my experience, it is much more common to find people who think they know loads of theory, but can't write a line of code. In reality, these people usually can't write a line of proof either.

      The best theoreticians aren't always the best coders, but they're usually able to code pretty well when they want to. I've much more frequently seen people who were great coders but couldn't handle more abstract algorithmic questions than vice versa. And I certainly think it's hard to say that great CS theorists who can't code is "the problem" in CS education right now...

      --

      I am the man with no sig!

    51. Re:Hmmm... by Hatta · · Score: 2, Insightful

      That's because it's computer science and not engineering. The problem is that people conflate the two. If you want a coder, hire a coder not a scientist.

      --
      Give me Classic Slashdot or give me death!
    52. Re:Hmmm... by Anonymous Coward · · Score: 0

      My first language was BASIC
      My second language was Z80 assembler.
      My third language was Forth
      My fourth language was Fortran-77 (Norsk Data variant) doing quantum mechanics
      My fifth language was VAX Fortran-77 doing commercial applications that would normally have been done in COBOL
      My sixth language was VAX Assembly Language, speeding up code and doing low-level system stuff. Some is still running in daily commercial use, critical to the operations of businesses after more than two decades, having outlived three projects to replace it. All were less effective and cost more. ...after that, I got promoted to management and didn't code any more.

      At the time, CompSci people learned Pascal and/or Ada.

      The language is less important than the ability to learn and apply new concepts.

    53. Re:Hmmm... by Belial6 · · Score: 1

      You can't go any lower level in the machine itself, because your code is not really running on that machine... Essentially, Java is far more magic than C++ because you have this black box called a "JVM" which is unexplained in its entirety.

      You have been blinded by marketing. The reason that it is called "Virtual Machine" is because that is exactly what it is. Java is an emulator. It's just that Sun thought "Virtual Machine" sounded more enterprisee. Saying that Java is magic because you can't go lower than the virtual machine is the same as saying that C++ is magic if you run it on VMWare.

    54. Re:Hmmm... by kaizendojo · · Score: 1

      edit hello.bat echo "Hello World" Alt+F X Y hello hello world

    55. Re:Hmmm... by Anonymous Coward · · Score: 0

      You have to engage students.

      If a student does not find learning how computers work engaging enough, they're in the wrong course. "Word processing" is next door, "system administration" is across the hall, "game design" is in another building and "code monkeying" is in India.

    56. Re:Hmmm... by mhesd · · Score: 1

      Mostly the shortest path is the best solution! ;)

    57. Re:Hmmm... by Garse+Janacek · · Score: 1

      I'm quite sure you meant: std::cout << "output" << endl;

      You seriously think that's easier to explain than System.out.println("output"); ? The C++ version is concealing even more hairy details than the Java version, while using even more symbols that can't be fully explained until later!

      If you think Java shouldn't be the intro language, that's fine (I think there's a case to be made for it, but I have mixed feelings). But C++ is definitely worse.

      --

      I am the man with no sig!

    58. Re:Hmmm... by sinner6 · · Score: 1

      But personally, I'd rather see introductory programming courses taught in Python or Scheme. Those languages are small enough that students can focus on program design without being encumbered by syntax and semantics.

      Isn't that like teaching kids to read for meaning in works like Catcher in the Rye, Moby Dick, ... before teaching them the simple grammer of first grade english class?

    59. Re:Hmmm... by Eli+Gottlieb · · Score: 1

      Actually, System.out.println() and cout are about equally cryptic, particularly because cout relies on templates and operator overloading just to work.

      You want a simple way to output "Hello World"? Let's try an old teaching language, Pascal:

      writeln('Hello, world!');

      And now the newest teaching language, Python.

      print "Hello, world!"

      Much, much simpler.

    60. Re:Hmmm... by illegalcortex · · Score: 1

      I know I will catch some flak for saying this, but non-garbage collected languages will soon be relegated to a COBOL-like existence.

      I pray you are right. The only thing keeping me from learning COBOL and getting a lucrative job working on the large codebase still out there is the hideousness of the environment. I could definitely stand a high paying niche job working on today's non-GC languages.

    61. Re:Hmmm... by RingDev · · Score: 1

      What "magic" are you referring to?

      Sorry, slashdot ate my <<.

      In this case, cout is a special object with its output side hooked to the console.

      Magic. How is it attached? What type of model does it use to interact? And most importantly, who cares?

      The System.out.println is much more magical, as there is absolutely no explanation for how the println prints to the console.

      Again, magic. System.out is a stream object that by default prints to the console.

      In either case the cout function and the System.out namespace are functionally identical for our intended use at this point.

      And a "stream" is relatively easy to understand, as it's an object that can take input and produces output using stream operators.

      Which requires the explaination of stream opperators, functions, and inputs. .Println requires the explaination of functions and inputs.

      IMO it is much easier to explain how System.out.PrintLn works because there is less technicalities exposed. The user needs to understand that there is a stream called out in the System namespace, and that they can use the PrintLn function to output a parameter to that stream. And that by default that stream is directed to the console.

      For cout the user needs to understand that there is a very special stream called cout, that they need to use stream operators (that have no english representation) to output to that stream and that they need to know reserved words that can be used to indicate a line end.

      As far as ease of explaination goes, the higher level language wins out, pretty much every time. It's a high level language, that's what it is designed to do.

      What is a waste is calling anything taught at a tech school "Computer Science". Most of them call it something else, like "Programming" or "Computer Engineering" or even "Software Engineering". Not many call it CS any more.

      Ehh, CS might not be the best term for it, but that's what it was called at the Tech schools I checked out and attended. I've seen gems of students come from both Universities and Tech Schools, I'm not about to say either is better than the other. They develope different skill sets for different purposes. That doesn't make University students smarter or Tech students better coders, it just means they are different. And the best thing to do as an individual is to attempt to learn as much as you can from both institutions.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    62. Re:Hmmm... by Anonymous Coward · · Score: 0

      On the flip side, I've had exactly the opposite experience, and that it was the theory-trained code monkeys that were the most intractable when it came to teaching them the actual art of programming. Most of the problem is that reality often forces them into corners where they need to unlearn what they were taught. If they don't, they tend to try to rejigger whatever problem they encounter to fit their preconceived theories, rather than base their theories upon the reality they experience.

      Civil and mechanical engineers don't have the luxury of re-implementing their "ideal universe" in order to produce a system that works "in theory", but for some reason computer science grads take it for granted that that is how computer programming should be done.

      A typical theory-light programmer can be taught be taught theory when necessary, but trying to get someone to unlearn a set of wrong headed ideas is much much harder.

    63. Re:Hmmm... by TheRaven64 · · Score: 1

      I've written about this line in detail, but I suspect you are part of the problem in misunderstanding the comment. A good astronomer knows a huge amount about optics and has typically built at least one telescope by polishing and mounting mirrors themselves. I learned far more optics as an amateur astronomer than I did at school. In spite of this, astronomy is not about telescopes, it's about stars - telescopes are just tools.

      A good computer scientist is the same. They understand every part of their computer, from transistors and gates, through low-level logic and up to operating systems and compiler. Given enough time, they could design their own computer and given enough resources they could build it. In spite of that, they understand that the subject is about algorithms.

      --
      I am TheRaven on Soylent News
    64. Re:Hmmm... by Anonymous Coward · · Score: 0

      For C++ you still have to explain or ignore what "std::cout" means, along with those "" tokens. So Namespaces are critical for both programs.

    65. Re:Hmmm... by Anonymous Coward · · Score: 0

      Oh god, perl.... bad bad example of simplicity.

      Now how about this:

      [maximv@mldev2 ~]$ echo "Hello World"
      Hello World

    66. Re:Hmmm... by Garse+Janacek · · Score: 1

      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.

      Err, did you see the part where he talks about how bad it is that calculus is taught by giving example problems from people's chosen field so they see how it's relevant? And how this just conceals how drastically new a tool calculus is, and it should be studied by itself in isolation, not as it is applied? I'm pretty sure there are people outside of CS who might disagree with that. I'm a fan of Dijkstra's research, but not so much his teaching philosophy...

      --

      I am the man with no sig!

    67. Re:Hmmm... by Anonymous Coward · · Score: 0

      I'm quite sure he was simplifying things and assumed a using statement was present. Besides, smart-ass, if you need it on cout, you need it on endl.

    68. Re:Hmmm... by Anonymous Coward · · Score: 0

      First off, what is wrong with, "System is the system library, Out is a function in that library, and it prints to the console."??

      Well, for one, it's wrong.

      System is the system library, that is true. Out is not a function in that library; it's not even a method in that library. Out is a PrintStream Object. One of the methods in that object is println(), and that is what prints to the console.

      Now, in aggregate I agree with you (it's about the same amount of explanation either way), but this is, after all, a discussion on programming languages. If semantics are important in any discussion, it's certainly for the one about a formally defined language :-)

    69. Re:Hmmm... by Chris+Burke · · Score: 1

      The standard way of teaching basic programming is procedural, then functional, then object orientated then onwards.

      Who teaches functional programming languages as a standard part of their curriculum, in particular as a "bridge" between procedural and object-oriented paradigms? I learned some Lisp in an AI class, but that wasn't part of the standard programming sequence which went Assembly-C-C++ (with the C and C++ parts now replaced with Java, sadly).

      --

      The enemies of Democracy are
    70. Re:Hmmm... by k.a.f. · · Score: 1

      For instance, to simply output a line to a command line in Java you're looking at System.out.println("output"); 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".

      This is a troll, right? Calling a method is harder to explain than applying a string literal to an ostream reference and receiving another ostream reference to which a special-purpose construct is then applied merely for its side effect? What color is the sky on your planet?

    71. Re:Hmmm... by Garse+Janacek · · Score: 1

      I'm quite sure he was simplifying things and assumed a using statement was present.

      Ah -- you mean, he was concealing details that will be explained later? Like he was criticizing the Java version for doing?

      I wasn't being a smart-ass, I was pointing out a legitimate contradiction in his complaints. The C++ version concealed namespaces, functions, the whole mess of chaining applications via overloaded operators, and for God's sake, references (which are much worse in C++ than in Java). To me, that looks a lot worse than what he's objecting to...

      --

      I am the man with no sig!

    72. Re:Hmmm... by phantomfive · · Score: 1

      It may look more reasonable to you (are you a java programmer, by chance?) but the GP's point is right. It is more human readable the same way applescript is more human readable. The 'cout' thing has more symbols, but each one of those symbols is easily explainable. The System.out thing has DOTS in it, which is clear to you, but to someone who doesn't even know how to print something onto the screen, dot notation is going to be a bit complicated (really: I tried teaching someone javascript as a first programming language, and he got the hang of the dots eventually, but it was hairy).

      Inevitably ever teacher just teaches 'System.out.println' is what you type when you want to print something. We will explain it all later. Just as the GP said. People can handle weird symbols easily. It's the confusing concepts that really slow them up.

      --
      Qxe4
    73. Re:Hmmm... by GXTi · · Score: 1

      $ cat > hello.pl
      printf("hello world\n");
      $ perlcc hello.pl -o hello
      $ ./hello
      hello world

    74. Re:Hmmm... by MartinSchou · · Score: 1

      From what you are writing, you are essentially arguing that the way we teach math in school is wrong.

      1+1=2. But you can't really prove that yet. That's VERY difficult to prove
      The square root of 4 is +/-2. Easy. But then we tell them that you cannot do the square root of a negative number.

      Both of these things hide some of the realities of actual math, because it's easier to handle this way.

      And so on and so forth.

      Logarithm tells us that 2+2 != 4, but rather 3.99 [ad infinitum] - how's that for a bit of confusion.

      You have to start somewhere. Sure, teaching the fundamentals is a good thing, but even in math some fundamentals aren't taught until you get waaaay beyond the intro to math. But just like in math, some times it's really nice to get to know the tools first and the precise knowledge of how it works later. If we had to know exactly how everything works before we started using it, physics would never be taught ...

    75. Re:Hmmm... by CorporateSuit · · Score: 1

      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?

      Finally, I can put my university Java courses to good use!

      output.stream.text.openRebuttalLibrary.strongRebuttals.javaIsABadFirstLanguage.showIcon.frownyFace.inputAudience.slashDot.inputArgument.cruel.ouputEmotion.snarky.noBorder.standardText.displaySettingsOptimal.blackFont.print();

      :no they're not :(

      --
      I am the richest astronaut ever to win the superbowl.
    76. Re:Hmmm... by Blibblob · · Score: 0

      It makes more sense if you merely think about the two of them as functions that take a string and put it on the screen. However the very concept of those dots requires an in-depth explanation of the paradigm of Object-Oriented-Programming whereas the cout is just a function. Which one is simpler? cout and the funky look really stupid and weird, but the concepts contained in the line are not complex in the least. However, teaching C requires a lot of glossing over and "black magic" explanations at the start as well. Arrays are necessary for even the simplest programs, yet to explain them requires an in-depth explanation of how memory itself works and pointers to addresses. Java abstracts the memory out of the question, which is both good and bad. Really they're both incredibly complex in even the simplest of situations, but students just need to understand that learning a language requires learning a plethora of ideas that are barely related to the writing itself. A monkey can write code, it's not hard. The hard part is figuring out the underlying algorithms and math.

    77. Re:Hmmm... by maxume · · Score: 1

      It's because the field is moving so fast.

      In other engineering disciplines, there are new materials and other things to keep up with, but advances are measured in fractional increments (10% stronger, 5% lighter, 8% cheaper, etc.) and most things are made of steel, concrete, plastic and/or aluminum. In computing, over the last 20 years or so, the basic substrate has improved by a factor of 10,000 or more (especially if you look at it in terms of capability per dollar, which is a pretty sane thing to do).

      --
      Nerd rage is the funniest rage.
    78. Re:Hmmm... by bpjk · · Score: 1

      No, its not. Look at Structure and Interpretation of Computer Programs (SICP), which was taught decades ago (and now available on-line for free; google it).

      It uses Scheme as its language but rather than present Scheme itself, the course starts with only a few primitives (numbers, symbols and closures/functions) and proceeds to build up to a relatively complete interpreter of the language itself, along the way covering imperative constructs, OOP, meta-languages (including a graphical one), streams (the original magical type; not the contemporary type) and much, much more.

      So, to adopt your analogy, it starts students of at a very basic reading level and adds new words and grammar (defined from scratch using only previously covered constructs) along the way, pulling students along.

      Note: of course, this is only one of the ways of doing gradually increasing complexity in courses, it's the lambda calculus way. The other way is the engineering way: start with hardware/assembler, work your way up to C and then to some OOP language. Problem with the latter method is that you'd have to find some awkward way of squeezing in functional, set/vector and other programming paradigms in there somehow if you want the course to be complete (and "science"), while the former can incorporate those readily.

    79. Re:Hmmm... by ceoyoyo · · Score: 1

      When I was in university we had to learn how to make our computers first, before we could learn to program them! You whippersnappers don't know anything until you've blown the glass for a tube!

      Actually, seriously, I think it's good to start off with some nice, readable mid to high level language. We did Pascal. Python is great. I've never thought Java was really appropriate because you get all the object orientation piled on right at the beginning. THEN, in the next course you get the keys to the kingdom - assembly. Our assembly course was more or less concurrent with a robotics course where we actually used the stuff for doing embedded programming. After that you move on to the stuff like objects and you appreciate them.

    80. Re:Hmmm... by Hotawa+Hawk-eye · · Score: 1

      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
      System.out.println("output");
      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".

      Don't you mean

      std::cout << "output" << std::endl;

      or do you say "don't worry what the line 'using namespace std;' at the beginning of this code does"?

    81. Re:Hmmm... by ceoyoyo · · Score: 1

      Hmmm. I agree with your thesis, but disagree with your example. The C++ line isn't a whole lot better (if at all) than the Java one. What you need is a good function:

      writeln("Hello World") (Pascal, the way I learned it)
      printf("Hello World") (C, also reasonable)
      print("Hello World") (Python, an excellent choice)

      That doesn't take any handwaving about objects OR streams.

    82. Re:Hmmm... by TheSpoom · · Score: 1

      Qbasic or shenanigans.

      --
      It's better to vote for what you want and not get it than to vote for what you don't want and get it.
      - E. Debs
    83. Re:Hmmm... by Anonymous Coward · · Score: 0

      I hazard to guess that most chemistry grads don't end up doing chemical engineering. It is a different (although obviously related) field. While chem grads obviously have the background, chem engineers do learn a lot of different things. And obviously chem engineers do learn some chemistry.

      While engineering builds on science, engineering is a distinct functions with distinct skills. This apply to computers as well.

      While there certainly are exceptions, in CS for some reason, there is a tendency to want to give people who want to be engineers a science education.

      As a 'software architect' (with an unrelated science degree) in the 'real world' (tm), the problems I see are engineering. While I certainly wouldn't want someone who couldn't understanding (say) a sorting algorithm, but actually writing one is close to irrelevant (and occasionally I have to stop CS types from wasting time writing needless CS complex data structures - when 'sub-optimal' built in ones will suffice and allow more time for end-user value).

    84. Re:Hmmm... by Falkkin · · Score: 1

      While I agree with your point in general, the particular example of

      cout << "output" << endl;

      is a poor one... it raises the obvious question of "what's <<?" which then requires either the "it's magic" answer or a lengthy discussion of operator overloading. Depending on compiler, you also might need to "using namespace std" (more magic) or write std::cout and std::endl (less magic but still requires an explanation). Also, what's "endl" and why can't I just write \n?

      A better example from Hello World might be "public static void main(String[] args)" ... compared to "void main()" there is a LOT of initially-unexplained garbage in the Java function declaration. :)

    85. Re:Hmmm... by Anonymous Coward · · Score: 0

      For instance, to simply output a line to a command line in Java you're looking at
      System.out.println("output");
      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".

      Ummm how is System.out more complex a concept then cout?

      Plus your example also introduces operator overloading. The Java one simply has method invocation - which will necessarily be taught very early in C++ as well.

    86. Re:Hmmm... by shutdown+-p+now · · Score: 1

      C++ is hardly suitable as a beginner language, too - you'll have to "wave away" things like "#include iostream" and "using namespace std" just as well.

      If you ask me, a good first language would be something from ML family (Caml Light is nice) used in an imperative manner (i.e. with loops etc). ADTs allow to explain things such as linked lists and trees without exposure to pointers (and NULL and SIGSEGV). All basic stuff - print, math functions, list operations etc - is in the implicitly imported standard module, so you can initially focus strictly on the algorithm itself, without being distracted by the scaffolding. Type inference also helps there - you can analyze something simple and working first, such as recursive quicksort, before even dealing with the concept of a "data type". This goes best if it's studied hand in hand with Math (as it really should be in school).

      Also, OCaml & Caml Light in particular have a very nice simple graphics library done largely in the manner of the good old Borland's BGI (if you remember what InitGraph() did in your days of Turbo/Borland C++/Pascal, you know what I mean).

      As for real world, well... myself, I learned on Turbo BASIC on my own, and later Turbo Pascal in school (it was, and, as far as I know, still is a very popular teaching language in schools all across the former USSR). It wasn't a bad choice either - its relatively strict syntax won't let you make a mistake easily, and is generally more readable than C; yet you can get to the more powerful stuff such as pointers if you want to. And, of course, easily accessible graphics.

    87. Re:Hmmm... by ChrisA90278 · · Score: 1

      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.

      A agree with the above 100% In fact our company tends to hire math, engineering and science majors with the idea that you can teach these people to write code in a few weeks but you can't teach a guy who only knows C++ Physics.

      Actually we have a well rounded staff. You need the guys who know the CS theory and the math and physics people too and technical writers and graphic artists and managers. You really do need "code monkeys" but then you need the experienced older guys who can tell the monkeys what to code up.

      But I do agree I see so horrible code written by "coders" who know only the details of some language but don't have a clue about (say) DBMS theory.

    88. Re:Hmmm... by Prof.Phreak · · Score: 1

      cat > hello.pl
      printf("hello world");
      ^D
      perl hello.pl
      hello world

      :-)

      --

      "If anything can go wrong, it will." - Murphy

    89. Re:Hmmm... by Anonymous Coward · · Score: 0

      But the C stands for console.

    90. Re:Hmmm... by maxume · · Score: 1

      "People who are not full of shit often stink less."

      A decent solution to both A and B allows work on C. A crappy solution to A or B means more work on the crappy solution.

      --
      Nerd rage is the funniest rage.
    91. Re:Hmmm... by markbthomas · · Score: 1

      >Logarithm tells us that 2+2 != 4, but rather 3.99 [ad infinitum] - how's that for a bit of confusion.

      But,

      3.999... = 3 + 0.999... = 3 + 0.333... + 0.333... + 0.333... = 3 + 1/3 + 1/3 + 1/3 = 3 + 3/3 = 3 + 1 = 4.

      So logarithms are right. There are more than four ways to write two squared.

    92. Re:Hmmm... by Anonymous Coward · · Score: 0

      separate.
      preparation.

      that is all.

    93. Re:Hmmm... by orclevegam · · Score: 1

      If teaching assembly doesn't interest and motivate the students then either the teacher is crap and needs to be fired, or the students should find something else to do beside programming. A good teacher can do a class based on assembly and hold the attention of the entire class quite easily, as most people who are learning programming (particularly in CS where theory is often more important than practice) should already be motivated to understand how the computer works. If you can't find the motivation to understand simple addressing and things like registers, you need to find a new major.

      --
      Curiosity was framed, Ignorance killed the cat.
    94. Re:Hmmm... by Otto · · Score: 1

      You have been blinded by marketing. The reason that it is called "Virtual Machine" is because that is exactly what it is. Java is an emulator. It's just that Sun thought "Virtual Machine" sounded more enterprisee. Saying that Java is magic because you can't go lower than the virtual machine is the same as saying that C++ is magic if you run it on VMWare.

      You have been blinded by not understand what I was talking about.

      I do know very well what a JVM is, and you should read my comments in the context that I know WTF I'm talking about. Then, maybe, you'll get my point that the JVM is a magic black box because you have no vision inside its operation within the context of the Java language itself.

      --
      - Give a man a fire and he's warm for a day, but set him on fire and he's warm for the rest of his life.
    95. Re:Hmmm... by Otto · · Score: 1

      Magic. How is it attached? What type of model does it use to interact? And most importantly, who cares?

      How it is attached is explained by showing the code how it is attached, and the way memory works, and so forth. It's all easily understood, and something that CS students will, at some point, need to understand.

      As for who cares, well, a CS student should care, and a CS teacher should care that his students know. It's a fundamental piece of computer science to understand how the fucking things work, don't you think?

      Again, magic. System.out is a stream object that by default prints to the console. In either case the cout function and the System.out namespace are functionally identical for our intended use at this point.

      False, because the "console" is not defined except in the context of a Virtual Machine that is outside the scope of the Java language itself.

      In Java, you cannot explain the console without going outside the language and into the Virtual Machine itself, because that machine is all there is. The "System" namespace is defined by the particular JVM implementation, it doesn't exist outside of that particular JVM implementation.

      In C++, you can delve deeper into C and memory and pointers and such, and explain how the console is hooked up, without referring to the specifics of the particular machine. Yes, you can then go even further and explain assembly and machine language and down to the wiring that hooks up the bloody screen if you want, but again, why?

      Which requires the explaination of stream opperators, functions, and inputs. .Println requires the explaination of functions and inputs. IMO it is much easier to explain how System.out.PrintLn works because there is less technicalities exposed.

      Those technicalities are what you're trying to teach. Or you should be, anyway.

      The user needs to understand...

      Your argument only makes any sense if you define "user". Because the "user" I'm thinking of is a Programmer. And IMO yes, a Programmer does need to know low-level details about the architecture he's working on. Because when it all goes wrong, then he'll have no fucking idea why unless he understands the details.

      Your way does not produce programmers. It produces script-kiddies.

      --
      - Give a man a fire and he's warm for a day, but set him on fire and he's warm for the rest of his life.
    96. Re:Hmmm... by Anonymous Coward · · Score: 0

      9.8/10.0

    97. Re:Hmmm... by MartinSchou · · Score: 1

      They aren't actually right - they're just a very effective tool.

      0.99... + 0.99... 2

      0.33... + 0.33... + 0.33... 1.

      There difference is pretty close to 1/infinite, but it's still less than 1. For all intents and purposes they are the same, but there's still a small difference

      But (1/3) + (1/3) + (1/3) = 1 no matter how you slice it.

      And that was my point. You shouldn't avoid using usefull tools, just because you haven't quite understood all of it. Imagine just how much you'd be freezing right now, if every seamstress had to understand every single bloody part of the physics and mechanics involved in sowing, carting, fabrication of synthetic fibers etc.

    98. Re:Hmmm... by Anonymous Coward · · Score: 0

      They said "A line of code" not "A fully functional C program in one line"
      besides, in perl, that's a perfectly valid program and language was never specified.
      $ cat > hello.pl
      printf("hello world");
      ^D
      $ perl hello.pl
      hello world$

    99. Re:Hmmm... by brkello · · Score: 1

      Actually, I think he would want you to do printf("\n");

      In any case, I don't think one example of how Java code makes more sense really demonstrates its superiority. It wasn't hard to learn Java after learning C/C++. It doesn't seem to work as well the other way around.

      --
      Support a great indie game: http://www.abaddon360.com
    100. Re:Hmmm... by Hellkitten · · Score: 1

      So you're trying to convince me that I should like taking the garbage to the dump myself every day.

      Well you might be surprised to know that my previous experiences with pointers, manual memory allocation and manual release of memory has been invaluable in my day job programming in for .Net.

      Knowing what you shouldn't do to avoid creating excess objects is good for memory usage and performance, and would have been a lot harder to even realize can be an issue if all you've done are garbage collected lanuages

      Secondly there are other scarce resources than memory, an relying on the garbage collector to release these (e.g. file locks) in a timely fashion will eventually bite you if the system is complex enough

      What you need for GC languages is a decent understanding of how the GC works (in your language/runtime) so you know when you have to help it out. And to get that understanding you need to understand memory allocations first

      --
      - We are the slashdot. Resistance is futile. Prepare to be moderated -
    101. Re:Hmmm... by Belial6 · · Score: 1

      You have the same vision that you do with C in VMWare. You either use pre-supplied code to do what you want or you dig into that code to see what it does. The JVM is totally irrelevent to the Java language verses the C language. The JVM is a computer. The X86 is a computer. There is no reason that the Java Language could not be compiled directly to X86, and there is no reason that C could not be compiled to run on the JVM.

    102. Re:Hmmm... by jafac · · Score: 1

      Almost everything at this point is either managed code with garbage collection built in, or there are toolsets you can use to manage memory for you.

      And this is the difference between a programmer, and a software engineer, who has the versatility to write everything from microcode for new hardware, J2EE applications, or administrative automation scripts. Incidentally - I don't think you get that breadth of skill right out of any 4-year program right now.

      --

      These are my friends, See how they glisten. See this one shine, how he smiles in the light.
    103. Re:Hmmm... by fbjon · · Score: 1

      But the C stands for console.

      Not to mention it isn't C, it's C++.

      --
      True confidence comes not from realising you are as good as your peers, but that your peers are as bad as you are.
    104. Re:Hmmm... by rhsanborn · · Score: 1

      As an individual learning programming I'd like to strongly agree with this. I took several introductory programming courses, most of which were in Java. It was reasonably easy to make it through the examples in the class, the difficulty came when I tried to branch out on my own and begin learning data structures and patterns. I'm now going and learning assembler and C so that hopefully the principles that are abstracted in higher level languages like Java will have a basis in something more basic like a lower level language.

    105. Re:Hmmm... by Anonymous Coward · · Score: 0

      Its a line of code.

      It doesn't have to COMPILE!

    106. Re:Hmmm... by Anonymous Coward · · Score: 0

      me:say "hello world!".
      you:hello world!

      No computer, no computer language....

    107. Re:Hmmm... by Anonymous Coward · · Score: 0

      How is this different from glossing over what printf() does in the canonical C example?

    108. Re:Hmmm... by RingDev · · Score: 1

      Those technicalities are what you're trying to teach. Or you should be, anyway.

      Ahh, but your initial assertion was that it is easier to EXPLAIN cout << "output" << endl;. Not that it was better teaching material.

      I would concur with you on that side. If your goal is to teach computer science bridging from machine code to high level languages, then C is a better route. If your goal is to write code that can be quickly and easily explained and immediately obvious to later reviewers, the Java/C# (or even C++) option is a better route.

      Your way does not produce programmers. It produces script-kiddies.

      No need for a pissing match. Not everyone who uses managed code is a "script-kiddie". And not everyone who codes in C is a Computer Scientist.

      You'll never bill time to a contract for developing your own compiler. (**except in a very limited number of situations). And only a handful of developers in the world will ever work on embedded software where memory management tools are not available.

      Is it good to understand how garbage collection works? Sure. Is it great to have the knowledge of how compilers work? absolutely! Will either make you a better developer in the vast majority of software development positions in the world? nope.

      But there are still great things that can be done with that knowledge, and there will always be a small demand for people who have studied hard on the subjects and are willing to push the envelop and work with the lower level technology. So I think it is excellent that it is taught in Universities.

      But for the vast majority of computer programmers in the world, such lessons will have no significant impact on their professional careers. Which is why I think it is excellent that it is NOT taught in Tech Schools. (depends on the school actually, most programs that I've seen still cover a semester or two of C++ pointers, memory management, and compiler directives, but nothing compared to the in depth focus most University programs do)

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    109. Re:Hmmm... by Anonymous Coward · · Score: 0

      printf("hello world");

      You forgot

        20 goto 10

    110. Re:Hmmm... by Raenex · · Score: 1

      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".

      Hilarious. And what will you say if they encounter an error like the following? The error in this case is that bar is missing parenthesis, as it's a function and not data. I ran into this just yesterday:

      cout << foo.bar << endl;
       
      $ g++ foo.cpp
      foo.cpp: In function 'int main()':
      foo.cpp:28: error: no match for 'operator<<' in 'std::cout << foo.Foo::bar'
      /usr/include/c++/4.3/ostream:112: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
      /usr/include/c++/4.3/ostream:121: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]

      15 more lines of the same follow. I'd give you the whole thing, but if I do Slashdot says: "Filter error: Please use fewer 'junk' characters."

      Indeed.

    111. Re:Hmmm... by gnud · · Score: 1

      Actually, I think you chose a really bad example for showing how Java is a bad first language.

      For someone reading their first lines of code, I would argue that System.out is more readable than cout, and println("text") is more readable than

      Don't get me wrong, I don't think Java is a good university language either. We use java for most compulsory courses at my uni, and I think it's a worse fit now (2nd year data structures) than in the introduction courses. I struggled with creating a hash function with no unsigned value, and a lack of pointers (specifically, you can't do "this = other_obj"). Maybe I'm just too used to C though.

    112. Re:Hmmm... by goose-incarnated · · Score: 1

      echo "echo Hello World" > hello
      . hello
      Hello World

      --
      I'm a minority race. Save your vitriol for white people.
    113. Re:Hmmm... by AVee · · Score: 1

      Amen
      All the focus on this or that programming language, even in this topic, is totally misplaced. Any decent programmer will learn any decent language in a fair amount of time. I learned more different programming languages while working then during my education. I can list all of these on my resume, but thats not really important. Because you can produce crap in any language anyway and because I will just learn whatever new language you want me to use this time.

    114. Re:Hmmm... by cslax · · Score: 1

      At my university, the gateway CS course is taught in Python. I already have 3 years of Java under my belt, but they're going to assume I do not, which is good.

    115. Re:Hmmm... by blonkm · · Score: 1

      which is why it should be 'print "output"'. OH NO, that's BASIC. If you write one line it you'll become mentally retarded.

    116. Re:Hmmm... by Anonymous Coward · · Score: 0

      You are the problem. Students who don't know theory can't solve problems, no matter how much code they write. But people like you are busy convincing schools to adjust their curricula so that students can "write a damn line of actual code." The result is a class of graduates who might as well have gone to vocational school.

    117. Re:Hmmm... by Anonymous Coward · · Score: 0

      The standard way of teaching basic programming is procedural, then functional, then object orientated then onwards.

      And by functional you mean; structured?

      So it's really imperative, then imperative, then imperative. Sometimes seasoned with sugar.

      So if that's all you learn about programming, you are probably missing something.

      As for the difference between System.out.println and cout, seriously...

    118. Re:Hmmm... by LunarCrisis · · Score: 1

      For instance, to simply output a line to a command line in Java you're looking at System.out.println("output"); 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".

      I'm no fan of Java either (and I think that none of C, C++, or Java make a good starting language), but that example is unfair. The C++ code would look either look like std::cout << "output" << std::endl; or feature a using directive, both of which require about as much hand-waving as "System.out".

      --
      Mr. Period: Nine is the one that's right by ten!
      Nine: One day I will kill him. Then, I will be Ten.
    119. Re:Hmmm... by omglolbah · · Score: 1

      How the college I attended did it....

      1. Semester: VB 6.0 (it was in 2003)
        - Doing more than the required work gave you negative points on your marks... People didnt bother learning much due to the teaching destroying interest :(
      3. Semester: ASM and C for PIC-Microcontrollers
        - Mostly useful, though somewhat messy since the teacher really didnt know ASM that well.
      4. Semester: C++
        - C++ without object oriented programming...
        - We were not allowed to use string classes. All strings were to be char arrays and use the C-style string handling.
        - We were not allowed to use Printf to format stuff, only cout.
        - Only command line apps.
      5.th Semester: C# .NET
        - Teacher didnt like us using "advanced" features of the .NET libraries.
        - Required us to turn in binaries in addition to source so "he wouldnt have to compile all the turn ins". (Yes, he ran unknown binaries...)

      So I have a less than stellar view of the CS teaching that goes on... My degree was in automations engineering but still, computer science is a major part of it.

    120. Re:Hmmm... by g0at · · Score: 1

      Frankly, I find printf("output\n"); to be more self-evident than either of the above.

      But then, I learned C first.

    121. Re:Hmmm... by Anonymous Coward · · Score: 0

      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
      System.out.println("output");
      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".

      Soo.. you are saying that it is easier to explain std::cout and c++ operator (const char[]) to total newbies, without saying 'it is magic' ?

    122. Re:Hmmm... by Anonymous Coward · · Score: 0

      You want a language worse than Java to teach in? Try MATLAB. For the engineering majors at my school, it's the only language they ever learn, and the teacher that I had, who wrote our book, btw, will sometimes explain how the code works by saying that MATLAB does it "automagically". And my school isn't nearly cruel enough to us engineering students. Most of the people who pass the class have no idea how to actually do any coding.

    123. Re:Hmmm... by Otto · · Score: 1

      Is it good to understand how garbage collection works? Sure. Is it great to have the knowledge of how compilers work? absolutely! Will either make you a better developer in the vast majority of software development positions in the world? nope.

      Wow. Okay, we're just going to have to agree to disagree on this one, because that is by far one of the stupidest things I've ever read.

      If you don't know how garbage collection and compilers work, then IMO, you are not a Programmer. You're only a code-monkey at best, somebody who can bang rocks together and can make things happen, but is incapable of anything higher-level than that. One of those useless management types, at best.

      --
      - Give a man a fire and he's warm for a day, but set him on fire and he's warm for the rest of his life.
    124. Re:Hmmm... by Otto · · Score: 1

      Nonsense. There is no technical reason that a subset of the English language cannot be compiled directly to the X86 either, but that doesn't mean that knowing English makes you a programmer or makes you understand how the things work.

      C is closer to the metal than Java is, for anything that currently runs Java. When you understand C, you have a better understanding of the underlying architecture. When you understand Java, you don't.

      --
      - Give a man a fire and he's warm for a day, but set him on fire and he's warm for the rest of his life.
    125. Re:Hmmm... by RingDev · · Score: 1

      I would venture a guess that many of the people who have contributed code to the /. code base do not know how garbage collection works.

      I would venture a guess that the majority of people who actively develop small business (and even large business) software solutions using managed code libraries don't know the intricacies of how garbage collection works.

      So long as they understand scope, and that the GC will clear memory when it decides it needs to, they are perfectly capable of writing great applications. Understanding they underlying windows pump messages and assembly level memory interactions is a waste of time.

      Is it good to know? Sure. But it will not make them a better application developer. And anyone who is cowboy enough to try to rewrite a memory management system while on contract has no business being on contract in the first place. The tools already exist, use them. If you want to design new tools, and you want to get into the intricacies of the GC, get a job with Microsoft, Sun, IBM or even the smaller 3rd party tool designer companies where you will be working on creating the next generation of tools. There are significantly more jobs for people who use the tools than those who design them.

      You want to talk about stupid reads, see how your CIO would feel about reading your time sheets with 200 hours dedicated to creating a new memory management system for an ERP application.

      If you don't know how garbage collection and compilers work, then IMO, you are not a Programmer. You're only a code-monkey at best, somebody who can bang rocks together and can make things happen, but is incapable of anything higher-level than that. One of those useless management types, at best.

      Going with your definitions, I've seen a "Programmer" cost a company half a million dollars in a single day. And I've seen "Code monkeys" develop top notch applications that saved companies millions of dollars every year.

      Personally, the debate doesn't matter to me. You may take offense that a "code monkey" who doesn't deal with assemblers or GC gets paid more than you, and the code monkeys may be offended by your pretentiousness, but in the end, it still takes both types of mind sets to push the future of software development.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    126. Re:Hmmm... by Otto · · Score: 1

      I would venture a guess that many of the people who have contributed code to the /. code base do not know how garbage collection works.

      Hell, I have no doubt of THAT. Have you ever looked at the monstrosity that is the Slash code?

      Is it good to know? Sure. But it will not make them a better application developer. ...The tools already exist, use them.

      Without knowing how it works, you have no way to gauge whether it is the correct tool to use or not.

      Knowing the right way to do things makes you better at anything, programming included. It's not about creating the tools from scratch or even needing to do so, it's about knowing how things work in order to choose wisely.

      --
      - Give a man a fire and he's warm for a day, but set him on fire and he's warm for the rest of his life.
    127. Re:Hmmm... by RingDev · · Score: 1

      Without knowing how it works, you have no way to gauge whether it is the correct tool to use or not.

      You seem like an intelligent fellow. I would venture a guess that you comprehend the basics of an internal combustion engine. You understand that an air fuel mixture is compressed and ignighted and the resulting expantion is used to force a piston down, turning a crank shaft and producing torque.

      Now, if we assume that you know that, and follow your logic, you should not be able decide if a car is an appropriate means of transportations.

      Why? Because I doubt that you are intimately familiar with the underlying technology of your car. The electronic control systems, the fuel delivery system, the air delivery system, the exhaust, etc...

      Do you honestly know the composition of all of the catalitic converters on your car and the temperatures they require to opperate correctly and the exact chemical reactions they produce to reduce your car's emissions? Do you know the composition of your engine block, it's rate of expansion, it's ability to transfer heat? Do you know the displacement of your heads, the valve presure, the oil gally routes? etc...

      And to my point, does knowing any of that make you a better driver?

      As for the GC issue. So long as a developer understands scope, and the basics of how memory works (this is the heap, this is the stack) then they are perfectly capable of making such a decision. Just as knowing the simple basics of how a car works allows a person to make decisions about their means of transportation, even if they can't tell a wankle from a otto.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    128. Re:Hmmm... by Anonymous Coward · · Score: 1, Insightful

      Are you cracked out? cout is an object, so you still need to explain OOP, and you have to explain that you're calling a member method <<, which also requires explaining operator overloading, etc etc etc.

      In my opinion the C++ version requires more because you really do need to explain operator overloading, whereas the Java version is bog-standard dot-notation method invocation. Obviously we don't agree on that point, but everyone should be able to agree that they both require quite a bit of 'splaining if the person has never seen a programming language of any kind.

    129. Re:Hmmm... by Otto · · Score: 1

      Why? Because I doubt that you are intimately familiar with the underlying technology of your car. The electronic control systems, the fuel delivery system, the air delivery system, the exhaust, etc...

      Do you honestly know the composition of all of the catalitic converters on your car and the temperatures they require to opperate correctly and the exact chemical reactions they produce to reduce your car's emissions? Do you know the composition of your engine block, it's rate of expansion, it's ability to transfer heat? Do you know the displacement of your heads, the valve presure, the oil gally routes? etc...

      I am a poor example, as I have done much work for many automotive manufacturers, so yes, I have done much work on automobiles and know them quite well. ;)

      As for the rest of your diatribe there, involving the heat transfer and composition and all that, knowing specific facts is not particularly useful, however knowing that these things occur is quite handy. Knowing that heat makes metal expand, for example, is a useful fact in and of itself, even if you don't know exactly how much a specific piece of metal expands.

      And to my point, does knowing any of that make you a better driver?

      Yes, it absolutely does.

      More to the point, it makes you a more knowledgeable human being, and makes you a better person overall, in everything you do. You never know how the facts will come together, and so a general knowledge of everything is very handy to have.

      As for the GC issue. So long as a developer understands scope, and the basics of how memory works (this is the heap, this is the stack) then they are perfectly capable of making such a decision.

      But will that decision be a good one or a bad one? Anybody can be lucky. A wider and deeper knowledge of the subject matter could lead one to a better decision.

      Just as knowing the simple basics of how a car works allows a person to make decisions about their means of transportation, even if they can't tell a wankle from a otto.

      Some decisions, yes. Others, no.

      --
      - Give a man a fire and he's warm for a day, but set him on fire and he's warm for the rest of his life.
    130. Re:Hmmm... by Anonymous Coward · · Score: 0

      I agree with this path; we learned C/C++ for 3-3.5 years in the BSc phase; at a pretty detailed level too; after that, believe it or not, it took the better of us _under_ a week to learn _and_ use Java. I don't think the converse path would have been so smooth and quick.

  5. engineering by Lord+Ender · · Score: 2, Insightful

    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.

    --
    A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    1. Re:engineering by argent · · Score: 0

      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.

    2. Re:engineering by mattMad · · Score: 1

      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.

    3. Re:engineering by Lord+Ender · · Score: 4, Insightful

      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.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    4. Re:engineering by Anonymous Coward · · Score: 0

      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.

    5. Re:engineering by Lord+Ender · · Score: 1

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

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    6. Re:engineering by amorsen · · Score: 1

      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.

      --
      Finally! A year of moderation! Ready for 2019?
    7. Re:engineering by hey! · · Score: 1

      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.

      --
      Post may contain irony: discontinue use if experiencing mood swings, nausea or elevated blood pressure.
    8. Re:engineering by Lord+Ender · · Score: 1

      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.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    9. Re:engineering by mattMad · · Score: 1

      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.

    10. Re:engineering by Yvanhoe · · Score: 1

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

      --
      The Wise adapts himself to the world. The Fool adapts the world to himself. Therefore, all progress depends on the Fool.
    11. Re:engineering by AKAImBatman · · Score: 1

      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!)

    12. Re:engineering by Entrope · · Score: 1

      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)__.

    13. Re:engineering by Draek · · Score: 1

      Actually, the world needs both. The fact of the matter is that many CS students are not only after Software Engineering, that's what they're being taught and poorly, so there's a lack of both good computer scientists as well as well-trained software engineers.

      --
      No problem is insoluble in all conceivable circumstances.
    14. Re:engineering by Anonymous Coward · · Score: 0

      Why, oh why can't I have mod points when the trolls come out?

    15. Re:engineering by otis+wildflower · · Score: 1

      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.

      The job of folks like Dijkstra isn't to produce useful software, it's to produce useful theoretical computer scientists, which require a different skillset and temperament from applied computer scientists/software engineers. The problem, of course, comes when one side attempts to embiggen itself at the expense of the other. Another problem is when they attempt to pass off incompetent, arrogant teaching as 'unfriendliness', when it's merely intellectual hazing. The subject matter may be hard, but when an instructor passes the load off onto TAs that can't speak English understandibly, appears once every few weeks to mumble unintelligbly and scribble illegibly on a chalkboard or overhead projector before a cavernous multi-hundred-seat coliseum, they're not making it any easier, and frankly they're not doing the job the students are paying them to do.

      Dijkstra shouldn't care how many ALUs or FPUs a particular CPU has, or how long its pipeline is, or how best to order instructions for parallel execution. But someone needs to, and compiler/driver wizardry like that is at least as complex and scary as pure theoretical CS maths, by necessity.

    16. Re:engineering by Anonymous Coward · · Score: 0

      In my school there is absolutely no CS theory required. Not even a "programming languages" course. Students are lucky to leave with good knowledge of Java. Even better, things like testing, performance measurement and the like are essentially ignored in favor of "feel good" style programming (don't ask).

    17. Re:engineering by geminidomino · · Score: 1

      I'm just wrapping up my capstones in a BSc in Software Engineering, and I can safely say I HATE all of that crap.

      The "Unified Process" to me just screams "Management Idea to inject themselves into software development."

      Then again, maybe it's just because my team has alternating making me want to kill them and myself for the better part of the semester...

    18. Re:engineering by Darth_Burrito · · Score: 1

      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".

      Almost everything taught applies to real world problems. Information doesn't know if it's theoretical or practical. It has value which is relative to its intended use. The sooner we embrace that fact, the sooner we'll have a balanced curriculum.

      At my university, topics like axiomatic semantics and countability are covered while topics like usability and user interface design are not. The topics presented are often far more important to the provider than they are to the consumer. It's a classic case of a developer that creates the product he thinks his customers should want without truly soliciting requirements.

    19. Re:engineering by Cederic · · Score: 1

      Software engineers need to know how to pick a good enough algorithm and use it. They don't need to know how to compare such algorithms, devise new ones, mathematically prove their accuracy or optimise their implementation. Fortunately computer scientists are happy doing such things.

      Computer scientists on the other hand haven't got a clue how to write software in a real world setting. Dijkstra mentioned formally proving the program meets the formal functional specification? Nobody ever writes a formal functional specification! How can you possibly prove your program meets it when it doesn't exist.

      Despite this, or possibly because of it, software engineers have automated most businesses on the planet.

      Software engineering is a serious discipline, and is about writing software. Computer science is also a serious discipline, but in a curious twist on your statement, it's got nothing to do with writing software.

    20. Re:engineering by Dragonslicer · · Score: 1

      Software engineers should understand use case analys, user interface design, project management and finance

      Software engineers only need to know a lot about user interface design if they're writing software that has a user interface (and even then, possibly only if they're working on the user interface portion). Having the knowledge is certainly an advantage, but you normally want a UI specialist, which not every software engineer is.

      Project management is somewhat borderline. It's a good skill to have, but most software engineers, especially younger ones, are not project managers (unless you work in a company with more managers than engineers, which is a whole different issue). Finance is even less useful if you aren't a high-level manager. If you're spending time as a project manager and accountant, you probably don't have a lot of time left in your day to do any engineering.

      I would say that what you really want from a software engineer is someone who's good at things like system architecture and program design. You need to be familiar with the kinds of tools available when building a software system, how to use a decent number of those tools, and how to connect the pieces together to accomplish the task at hand.

    21. Re:engineering by DigitalCrackPipe · · Score: 1

      I would argue that many computer science degree programs produce programmers, not software engineers. It may be a subtle distinction, but I think some of the discipline that the term "engineer" evokes is not at all focussed on in many CS programs. Code reviews, documentation, working on a multidisciplinary team, presenting findings... ok, so maybe most of the meat of that needs to be picked up after graduation anyway. Still, given the limited amount of time in an undergraduate degree it seems that one must choose areas to focus more on within the software realm. Practical (vs. theoretical) CS is likely to lean more towards producing an employment-ready programmer, which is I think what you were going for.

    22. Re:engineering by Alpha830RulZ · · Score: 1

      I would add that there is now application/infrastucture engineering, which is different than software engineering. Defining the application/hardware/system infrastructure is significantly different field than designing the software that runs inside that environment.

      --
      I was taught to respect my elders. The trouble is, it's getting harder and harder to find some.
    23. Re:engineering by argent · · Score: 1

      Software engineers need to know how to pick a good enough algorithm and use it. They don't need to know how to compare such algorithms

      Um, yes, they absolutely do. How the hell can you pick an algorithm if you don't know how to compare them?

      Programmers need to understand engineering, AND they need to understand mathematics. That's why I took CS from an engineering school, instead of a math department... but it's also why I took CS at all.

    24. Re:engineering by argent · · Score: 1

      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.

      The OP was arguing that "software engineers" didn't need to know the mathematics. They just needed to know how to glue bits of working code together. That's what you do when you use desktop publishing tools... my point isn't that they need to be computer scientists, but rather that they still needed that knowledge. BOTH practical and theoretical understanding of the subject are absolutely necessary.

    25. Re:engineering by Liath · · Score: 1

      Did you read TFA at all? "Engineering", "tools", "connect the pieces together", "software system"!?!?!?

      He would shame you out of the lecture hall!

    26. Re:engineering by Anonymous Coward · · Score: 0

      Ideally, if you want to be a Software Engineer, dont be a Computer Science major.

      Sure a Computer Science curriculum may detract from a Software Engineer's education, but it works the other way around as well.

      When I was at college as a CS major, 85% of the students wanted to go do web design or interface design after graduation. I would be lying if I said that my 4 years were not an exercise in frustration because the material I wanted to learn was being completely left out.

      Students are not ill served by learning Computer Science and not Software Engineering in a Computer Science curriculum. The fact is Software Engineers should not be in a real Computer Science program. As you pointed out, its does them little good. Software Engineers need to push for their own major. It would be better for both groups.

      And yes, I realize that is highly unrealistic.

    27. Re:engineering by argent · · Score: 1

      I don't know what you think FrontPage has to do with anything.

      If you're just gluing components together without understanding them, as the OP seemed to be suggesting, you might as well be using that kind of canned office-automation application. Because that's basically what they do, and you won't be safe doing anything more.

      but we don't need four years of that while ignoring more important topics.

      You don't need four years to learn calculus, but we don't need engineers who can't integrate a school (that's school squared plus a constant).

      You don't need four years to learn the computer science a programmer needs, but we don't need programmers who don't understand the theory.

    28. Re:engineering by Blakey+Rat · · Score: 1

      FYI, Frontpage has turned into Expression Web, pretty much the best HTML editor around right now. (For Windows, at least.) You're going to have to find something new to make fun of.

    29. Re:engineering by argent · · Score: 1

      DAMN YOU MICROSOFT, STOP TAKING MY TOYS AWAY.

      (Filter error: Don't use so many caps. It's like YELLING.)

      (Yeh, I'm yelling. Wanna make something of it?)

    30. Re:engineering by Cederic · · Score: 1

      How can I pick an algorithm? Hmm. Lets see.

      Published papers (by Computer Scientists) all recommend algorithm X above Y and Z. Default libraries implement X and Y. Journal articles state "use X here and Y there".

      Do I need to do original research to compare X, Y and Z or do I just need to pick the right fucking one?

      Programmers need many skills. Software engineers need critical thinking skills and people skills. They do not need heavy mathematical backgrounds.

      It's fucking elitist and wrong to require a computer science background for programming, let alone software engineering. Most top programmers and software engineers do not have a compsci degree, and it hasn't held them back at all.

      Knowing compiler theory, understanding memory allocation optimisation mechanisms, being able to reverse engineer public key encryption mechanisms.. sure, this is all good fun. I'd far rather give a job to someone that knows how to talk to people from a non-computing background and translate their needs into working software.

    31. Re:engineering by StikyPad · · Score: 1

      what most students studying the subject really are after is software engineering

      And what he's saying is that you can't get there from here. From EWD (or TFE, if you prefer):

      A number of these phenomena have been bundled under the name "Software Engineering." As economics is known as "The Miserable Science," software engineering should be known as "The Doomed Discipline," doomed because it cannot even approach its goal since its goal is self-contradictory. Software engineering, of course, presents itself as another worthy cause, but that is eyewash: if you carefully read its literature and analyse what its devotees actually do, you will discover that software engineering has accepted as its charter "How to program if you cannot." ...

      In the same vein I must draw attention to the astonishing readiness with which the suggestion has been accepted that the pains of software production are largely due to a lack of appropriate "programming tools." (The telling "programmer's workbench" was soon to follow.) Again, the shallowness of the underlying analogy is worthy of the Middle Ages. Confrontations with insipid "tools" of the "algorithm-animation" variety has not mellowed my judgment; on the contrary, it has confirmed my initial suspicion that we are primarily dealing with yet another dimension of the snake oil business.

      What he's getting at is that skipping from "this is a computer" to "click this to create your program's window," without discussing why and how it works results in inferior "solutions," just as skipping from "here's an essay" to "let's discuss it" without reading it results in an inferior, or at least redundant, discussion.

      While his argument may not be as obvious in present day, where we have instant feedback, instant access to information, and (more importantly) access to helpful experts, it is fundamentally sound. Without a comprehensive understanding of the technology you are using, the "solutions" crafted will be less efficient, ill suited to the task, and/or can (and often do) solve simple problems at the cost of creating much more complicated problems. This is readily apparent in a plethora of "business" software. One model is used to suit a given set of tasks, and then "modified" to perform specific functions based on customer request. The customer often ends up with a "solution" which is more expensive and time consuming than what they were doing to begin with . In many cases, the software engineer's "solution" is a hackneyed effort that costs more to "maintain" (a topic which is also addressed in the essay) than a proper effort by a knowledgeable programmer would have cost in the long run. The customer or owner is, in real terms, poorer for the experience, despite the fact that he saved money in the short term by hiring a "software engineer."

      In essence, his argument can be summed up as "the real shortcut is to do it right the first time." In this case "doing it right" means using fully-trained programmers who understand that "saving" something is a user-level concept, and means that understanding how to create black-box programming modules is the best way to know when and how to implement them. How can you know whether a given objective is complicated or simple unless you understand how the machine works? Sorting a list might seem like a complicated task on the outset, but learning binary trees and bubble sorts shows that it's a fairy simple operation for a logic machine. Voice recognition might sound easy to someone with no experience in programming (after all, dogs can do it), but it's a fairly difficult task for a machine. Those are somewhat extreme examples, implying complete ignorance in the latter case, but the issue becomes even more compelling when you get into less cut-and-dry tasks.

      Personally, I feel that real-world results trump theory any day, and I don't have enough experience to say who is right.. I see plenty of real-world scenarios in w

    32. Re:engineering by argent · · Score: 1

      Do I need to do original research to compare X, Y and Z or do I just need to pick the right fucking one?

      Who said anything about "doing original research". I'm just talking about understanding the theory. We're talking about something that is as fundamental to computer science as atoms are to physics.

      If you don't understand WHY X, Y, or Z is best for A, B, or C, you're going to make the wrong choice.

      It's fucking elitist and wrong to require a computer science background for programming

      I didn't say that. Taking courses in theory doesn't mean "having a CS background" any more than taking freshman physics courses means you're a physicist.

      Knowing compiler theory, understanding memory allocation optimisation mechanisms, being able to reverse engineer public key encryption mechanisms.. sure, this is all good fun. I'd far rather give a job to someone that knows how to talk to people from a non-computing background and translate their needs into working software.

      Are you looking for an engineer or an architect? Either way, you don't want to pick one who doesn't know the kind of carpet to put in high traffic areas, but you also don't want to pick one who thinks you can use balloons full of phlogiston to support a balcony. You need BOTH... the article I was responding to was dismissing something as fundamental as atomic theory as "irrelevant".

    33. Re:engineering by DamnStupidElf · · Score: 1

      I think Dijkstra's basic hypothesis is that the user interface IS the problem. Most people don't understand computers, and trying to turn computers into appliances via simple user interfaces is, in the end, rather silly from a computer science point of view. From a normal person's point of view, they have some magic device that helps them in some way if they invoke it properly. Dijkstra's goal is for humanity in general to abandon "magic" and focus on fundamentally understanding computers.

    34. Re:engineering by Faraday's+Sloth · · Score: 1

      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.

      From the pragmatic point of view, there are two issues at play here. One - how to build decent programs that are maintainable and - two - understanding how such a program actually works. If your skills lack in the former, your code is probably near-to-useless in the long term for anyone. If you lack in the second - THE HARDER PART (pardon my caps) - then you are just partaking in a cargo cult that just happens to work because someone left you the tools that luckily get you the job done. I also think the second skillset requires a lot more effort to acquire than the first.

    35. Re:engineering by Entrope · · Score: 1

      You are right that the user interface is often the biggest problem when a person is programming computers. (I am not sure that Dijkstra was thinking about that, because when he wrote that the user interface was typically a simple command-line affair.) The most common fault in user interfaces is that programs meant for non-programmer users tend to expose a computer's inherent non-linearity too easily or too much.

      Whining that the user perspective is "rather silly from a computer science point of view" is irrelevant; the computer science point of view is not the only relevant one. Unless you think everyone in the world should be trained as a competent computer programmer, understanding computers at the level Dijkstra advocates is not a solution to informal or incomplete program specifications.

      Again, his beef is that programmers do not -- at least, not often enough -- view writing a program as an exercise in constructing a thing that provably meets a formal specification. In the end, the person who is paying for the work will almost always decide "Oh, did I say *that*? What I really want is __(some other thing)__." Vendors tend to do the same thing. These changes require a rework of some, and perhaps much, of the formal specification and of all the downstream work. Until and unless everyone becomes a perfect systems analyst, you will not remove that disconnect.

      Not to unduly demean wankery, but figuring out ways to cope with that is what separates software engineering practice from computer science wankery.

  6. When I was your age... by ittybad · · Score: 1

    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.

    --
    No single raindrop believes it is to blame for the flood.
    1. Re:When I was your age... by Anonymous Coward · · Score: 1, Funny

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

    2. Re:When I was your age... by DamnStupidElf · · Score: 1

      The fact that you refer to it as a "C++" data structures course belies your problem; data structures (and algorithms) are language neutral. You should be able to take any formalization of a language equivalent to a turing machine and implement the same data structures and algorithms that you can in C++. That is the sole meaning of computer science, as far as I'm concerned.

  7. Cruel and couldn't use a computer by noldrin · · Score: 4, Insightful

    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.

    1. Re:Cruel and couldn't use a computer by Malc · · Score: 5, Insightful

      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.

    2. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0, Redundant

      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?

    3. Re:Cruel and couldn't use a computer by SatanicPuppy · · Score: 3, Insightful

      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.

      --
      ad logicam Claiming a proposition is false because it was presented as the conclusion of a fallacious argument.
    4. Re:Cruel and couldn't use a computer by TheRealZero · · Score: 0

      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?

    5. Re:Cruel and couldn't use a computer by SageinaRage · · Score: 5, Insightful

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

    6. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      "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.

    7. Re:Cruel and couldn't use a computer by jazzduck · · Score: 1

      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.

      Because at least what you learned would be a desirable skill on the job market for the next five years, instead of never being a useful job skill at all.

      --
      A cat is no trade for integrity!
    8. Re:Cruel and couldn't use a computer by Amazing+Quantum+Man · · Score: 2, Insightful

      Oh, I don't know....

      When I was in college, we (the students) were pushing for the CIS department to offer a course in...

      wait for it...

      VAX assembly.

      That's real useful now, isn't it?

      --
      Fascism starts when the efficiency of the government becomes more important than the rights of the people.
    9. Re:Cruel and couldn't use a computer by SPQRDecker · · Score: 1

      Biochemistry?

    10. Re:Cruel and couldn't use a computer by ObsessiveMathsFreak · · Score: 2, Insightful

      That sounds like just about every biology class I've ever heard of.

      --
      May the Maths Be with you!
    11. Re:Cruel and couldn't use a computer by Malc · · Score: 1

      Useful assembly language (i.e. beyond the concepts) that you learn in first year will be useful four years later when you hit the job market? What happens if you stay on for a postgrad? It becomes even more obsolete. If you're going to keep your assembly skills up-to-date (across multiple architectures???) from the point of learning it to the time of employment after university, is no different to learning real assembly outside of the course, but with the disadvantage of having learnt fewer concepts or not learnt them as well. From my 12 years postgrad experience as a software engineer, languages are languages and I can learn them as I need them. The ideas that I'm trying to express in whatever language/framework/class library are the important bit.

    12. Re:Cruel and couldn't use a computer by tucuxi · · Score: 1
      I am only quoting TFA: "unwarranted analogies lead to medieval thinking".

      And your analogy is bad, because algorithms are algoriths, and can be analyzed and created and proven without being embodied in a computer program. Fighting fire with fire, it is like trying to understand biology by butchering small furry animals, instead of analyzing the underpinnings of the many systems that make *all* animals tick.

      Sure, somewhere along the line you should do field work and see examples of the variations of said systems in different animals. But that does not make understanding the basics any less necessary.

    13. Re:Cruel and couldn't use a computer by Kingrames · · Score: 1

      Or studying anatomy and reproductive systems, without... well, you know...

      --
      If you can read this, I forgot to post anonymously.
    14. Re:Cruel and couldn't use a computer by thetagger · · Score: 1
      why would you want to learn something specific that would be out-of-date in short measure? Seems rather myopic to me.

      Why is it worse to learn something that may be obsolete compared to something that never existed, and never will?

      You know, it's not like there aren't long-standing standards in computing. I bet that some form of Unix and C will still be around in 30 years - a bit like they were around for the past 30 years. C is a simple language, Unix is a simple operating system, the both have niches that will always exist. They were not created as much as they were discovered.

      You know that some professors would rather hide in the comfort of their make-believe world rather than expose their lack of understanding of the real world.

    15. Re:Cruel and couldn't use a computer by Garse+Janacek · · Score: 1

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

      Eh? No, it's the equivalent of studying the simplest possible living organisms to prepare for the later work of understanding more complex ones. It's still the same subject matter, but it lets you focus on the most important concepts before getting caught up in the specific details that vary from case to case.

      Teaching on a fake OS lets you write your own kernel while bypassing the tedium of bootstrapping and such. Teaching fake assembly lets you write your own compiler while avoiding some of the irrelevant gotchas or (initially) unneeded sophistication of real machine code. I've done both of these things, and my understanding of kernels and compilers is much better for it. The same result would not be possible if you gave students 6 weeks to write a real kernel from scratch that ran on real x86 system...

      --

      I am the man with no sig!

    16. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      I am trying to determine if this is a troll or not considering TFA is basically a big rant about not using analogies. Oh, wait... Slashdot. Nevermind.

    17. Re:Cruel and couldn't use a computer by chunkyq · · Score: 1

      I don't know what you were expecting. Computing science is a sub-field of mathematics (a sub-program at many schools). Your complaint is similar to, "Don't go into theoretical physics if you like experiments." CS isn't about how to clean a computer, or how to use the disk defragmentation utility.

      A graduate of a computing science program is (ideally) a scientist, not just a technician.

    18. Re:Cruel and couldn't use a computer by MikeBabcock · · Score: 2, Informative

      University vs. College.

      Comp Sci. is not a trades course; go to a local community college and take a technology or programming course if you want real-world examples.

      Computer Science is about learning to understand computing, whether you use real or completely fictional interfaces.

      --
      - Michael T. Babcock (Yes, I blog)
    19. Re:Cruel and couldn't use a computer by greg_barton · · Score: 1

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

      The practical applications exist because folks applied theory to problems.

    20. Re:Cruel and couldn't use a computer by msuarezalvarez · · Score: 1

      <quote>
      What's wrong with adding a full-year course in the final year, covering actual in-the-field coding techniques?
      </quote>
      <p>That it either removes one year of courses or it lengths the whole thing by a year...</p>

    21. Re:Cruel and couldn't use a computer by Darth_Burrito · · Score: 3, Insightful

      Rule Number 1 of Computer Science - Don't reinvent the wheel. Everyone who invents their own education focused language that's only used at their school is violating the first rule of computer science. At my university, the first year of programming is taught in a java like variant of C++ called Resolve C++. Why is it bad?

      1. It hurts students applying for co-ops/internships because none of the employers no what it means.
      2. It hurts students because there are about a thousandth of a percent of the sources of information about Jo-bob's made up educational language as there are for something like Java.
      3. It hurts students because they don't feel like they can go home and make useful projects in weird language XYZ in their own time.
      4. It wastes time because you are rolling your own instead of reusing something tried and true. As the needs of the modern world change, will your made up language be able to change with it, or will it stagnate like everything else in academia?
      5. By rolling your own when a veritable shitstorm of acceptable solutions exist, you are setting a horrible example for your students.
      6. Most importantly, while students are not always right, they absolutely hate it when they are forced to learn some professors pet project and if something useful is only slightly harder why piss them off.
    22. Re:Cruel and couldn't use a computer by Jim+Hall · · Score: 1

      My degree is in physics, not CS - so forgive me if this is a stupid idea. But I work at a university, and once suggested to a CS professor to assign students in the "Compilers" class the problem of: invent a programming language that supports basic (defined) sets of procedures. But you can only use the character set of a punch card: A-Z (uppercase), 0-9, 72 columns, etc.

      (Students who take "Compilers" are often given a project to create a programming language, but they are allowed the full ASCII character set. This idea would scale that back a bit.)

      I thought it would be interesting to see how students would design their programming languages with that limitation. Would they create LISP-like structures? Would it instead look like BASIC or FORTRAN? Or would students implement a C-like language using the smaller character set?

      Students today don't learn about FORTRAN, and they learn LISP (or SCHEME) only if they take an "AI" class. I thought students could learn a lot by giving them a scenario faced by early pioneers of computer science. They would gain first-hand understanding why certain programming languages are designed they way they are.

      But the CS professor I spoke with didn't think students would learn anything from this, that it was too "artificial" a problem for them. Ah well.

    23. Re:Cruel and couldn't use a computer by sslayer · · Score: 1

      Not at all, it's the equivalent of a biology class in which you study man specially crafted cells and organisms to better understand the basics of life, instead of trying to approach a much more complex organism.

    24. Re:Cruel and couldn't use a computer by TheRaven64 · · Score: 2

      Fake assembly languages and operating systems are typically taught because they illustrate the concepts in a general way. I was taught a simple, made-up, register-to-register assembly language in a couple of modules. Since then I've done a bit of PowerPC and a bit of x86 assembly coding for things that couldn't be expressed in C (atomic operations and vector stuff), and I am very glad that I wasn't forced to learn x86 asm back then. It would have confused the issues and resulted in my learning less.

      --
      I am TheRaven on Soylent News
    25. Re:Cruel and couldn't use a computer by TheRaven64 · · Score: 1

      You don't go to university to learn specific skills, you go to university to learn how to learn specific skills. Learning a simple three address code and the principles of CPU architecture let me easily pick up x86, SPARC and PowerPC assembly enough to be able to read code for these architectures and hack together some simple routines when I needed to. If I'd learned x86 assembly instead, then I'd have spent a lot of time trying to understand paged segments and different indirect addressing modes, and then promptly forgotten it all before I actually had a use for it.

      --
      I am TheRaven on Soylent News
    26. Re:Cruel and couldn't use a computer by Dragonslicer · · Score: 1

      Why is fake assembly and fake OS cruel?

      In my case, it was because the virtual architecture of the system we had to write the fake OS for made things ridiculously difficult. The processor only had one register, and everything was character-based instead of binary. At that point in the curriculum, we had all had two semesters of assembly programming (one Intel, one Motorola), so it wasn't as if we didn't know how to deal with binary numbers or multiple registers.

    27. Re:Cruel and couldn't use a computer by dschuetz · · Score: 1

      Oh, I don't know....

      When I was in college, we (the students) were pushing for the CIS department to offer a course in...

      wait for it...

      VAX assembly.

      That's real useful now, isn't it?

      I can beat that.

      I took a class (actually, an Electrical Engineering class) that taught the basics of assembly and low-level computer design. We interfaced FORTRAN with Assembly on a Sperry-Rand UNIVAC 1100/90 mainframe. With a line editor. It was actually pretty damn cool.

      Then I changed majors to Comp Sci and learned all about mathematically verifying programs using some kind of weird "Program Calculus" that I strongly suspect was based on Dijkstra's research. (I wouldn't be surprised if he was one of the authors of our textbook, but since this was 20 years ago I'm not sure which came first -- the theory or the EWD).

    28. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      Having a Biology degree, and having done research, I can easily say, "no living organisim can easily be explained within the course of a semester, yet alone a year."

      The best you can do is explain some of the highlight chemical reactions and characteristics that illustrate what is common to many organisms, while constantly saying "of course, some organisms differ in this interesting way." To fully understand an organism would take many years, if it is even achievable.

      Naturally, you're free to disagree with me, but just try to explain photosynthesis by looking at a whole plant. Either you'll have to revert to a Medieval understanding of plant growth or you'll have to do a lot of "believe me because it's true" hand waving. Even biochemistry takes nearly a semester covering the simplest paths in sugar to energy transformation, and that's incredibly well understood.

    29. Re:Cruel and couldn't use a computer by tygt · · Score: 1

      Was this at UCSC?

    30. Re:Cruel and couldn't use a computer by SatanicPuppy · · Score: 2, Insightful

      Typical snobbery. As long as you're learning the theory, why shouldn't you do something practical? I'm sick to death of academics who work their asses off to create some wild assed "teaching language" or "teaching OS" just to prevent you from ever actually getting to touch the real thing.

      --
      ad logicam Claiming a proposition is false because it was presented as the conclusion of a fallacious argument.
    31. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

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

      Great analogy. Dijkstra would be proud.

    32. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      A better analogy might be studying stars by studying telescopes.

    33. Re:Cruel and couldn't use a computer by wild_berry · · Score: 1

      And wrong: page 17-18 has a list starting at 0 and Dijkstra cites the item numbered '(6)' as the sixth. It's the seventh: he got his index arithmetic wrong. I only know this because of my schooling in formal methods...

    34. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      "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" - by noldrin (635339) on Tuesday December 02, @09:58AM (#25959423)

      LOL!

      Man - What a CROCK OF SHIT:

      Have YOU ever considered that the ONLY reason you can use a computer, now in their "1 click GUI easy" paradigm, is because of programmers (who, by the by, take computer science as their major mostly, or DataProcessing/MIS degree tracks), who make those tools for YOU, the USER, to use?

      Who is this moron who posted what I quoted, & other ridiculous stupidity? Who is the bigger idiot(s) who "modded him up", as Insightful?? Network admins/engineers/techies, who themselves are NOTHING MORE THAN USERS WITH A BETTER PASSWORD & ACCESS RIGHTS than most users only, & also depend on programmers/coders/software engineers?? /. used to be a GOOD sight, with truly insightful & educated membership... after reading posts like the one I quote excerpts from above? I am wondering what has happened to the guys I noted (actually skilled & smart people in the art & science of computing, instead of "learn by rote monkeys")...

    35. Re:Cruel and couldn't use a computer by jmorris42 · · Score: 1

      > Useful assembly language (i.e. beyond the concepts) that you learn in first
      > year will be useful four years later when you hit the job market?

      Yes. Because 90% of learning assembly isn't learning the opcodes of one cpu it is the way of thinking on such a small level. I taught myself 6809 assembly years and years ago. A couple of years later I picked up 6502 with little effort. Didn't do any assembly for a long time but this year I learned AVR assembly without a problem because I knew that 90% that doesn't change. I have looked at x86 a few times but haven't yet needed to actually learn it. Yes it is much more complex but it doesn't look all that alien.

      More important though, knowing assembly means I really understand concepts like pointers in languages like C. I really understand the idea that a character is just a number and a string is an array of them. I know why C terminates a string with a \0 and why that isn't always the best idea.

      News flash, whatever specific language skills you learn in school isn't likely to be a sellable skill a decade later. C excepted. But if you learn to program assembly it will help you understand what is actually going on in a computer and that knowledge will help you with everything else.

      It isn't too late to learn. Buy your self an AVR trainer board and learn to program assembler. 6809, 68000, 6502 or Z80 would also be good first places to start but you can't find ready to use hardware as easy. And the AVR makes a good first step into embedded which helps you to understand hardware issues better, it's why I started playing with it. You can get started with an AVR for $20USD if you are really frugal and still have a parallel printer port on one of your PCs.

      --
      Democrat delenda est
    36. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

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

      As a theoretical computer science student, I'd like to see the proof of your claim now.

    37. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      Or it's the equivalent of an astronomy class detailing the nature of stars and planets without actually examining any telescopes.

    38. Re:Cruel and couldn't use a computer by tarpitcod · · Score: 1

      They'd be fine until their favorite assembler optimized the FAR JMP into a SHORT JMP, and on engagement of hyperdrive the CPU bounced too close to a super nova because the TLB's hadn't been flushed...

    39. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      Actually, we do precisely that. That's the difference between the traditional biology approach of naming and surveying organisms, and biological science. In the latter it's typical to approach issues at a more theoretical level, either at a cellular or subcellular level, or conversely, dealing with entire sections of the phylogenetic tree.

      I agree entirely with Dijkstra on this issue (having come from CS before going into biology). He's right. Software "engineering" isn't engineering, it's ritual invocations and magical thinking done while wearing the garb of the engineer or scientist in the hopes nobody will notice.

    40. Re:Cruel and couldn't use a computer by DamnStupidElf · · Score: 1

      Typical snobbery. As long as you're learning the theory, why shouldn't you do something practical?

      If you're learning the theory, why can't you just apply it to any programming language of your choice? The hard part of computer science is not the mapping between the theory and a particular implementation of a programming language. That was sort of the point of the article.

    41. Re:Cruel and couldn't use a computer by DamnStupidElf · · Score: 1

      Things wrong with your post:

      0) you don't understand numbering schemes.

      1) you don't understand computer scientists.

      2) you insulted dijkstra.

      The 2nd is by far the worst, the 1st is understandable, but the 0th is where your problem started.

    42. Re:Cruel and couldn't use a computer by SudoScience · · Score: 1

      My degree is in physics, not CS - so forgive me if this is a stupid idea. But I work at a university, and once suggested to a CS professor to assign students in the "Compilers" class the problem of: invent a programming language that supports basic (defined) sets of procedures. But you can only use the character set of a punch card: A-Z (uppercase), 0-9, 72 columns, etc.

      I've only just begun my CS degree, but that sounds, to me, like a great idea. The ideas ought to be to get the students thinking about problems in terms of fundamentals rather than specifics.

      Also, why would having to learn a "fake assembly language" or make a "fake kernel" be bad? I keep hearing people talk about needing to have languages to put on their resumes. Maybe I'm mistaken, but it seems to me that languages are the easiest things to learn. Anyone can plop down with some materials and learn Java, or C++, or whatever language, if they try hard enough. By asking for them to focus on languages that are marketable, you're ignoring that the goal of computer science should be to understand computing and programming in general. A CS degree should equip you to be able to learn and work in any language. A CS degree shouldn't, instead, pump out popular language X programmers, because the popular language X will always be different year-to-year and job-to-job. Maybe Java or C++ or PHP is sexy now, but it won't be sexy later. If that held true, we'd all be programming in COBOL, FORTRAN, and PASCAL.

      At least in my opinion.

    43. Re:Cruel and couldn't use a computer by AK+Marc · · Score: 1

      Eh? No, it's the equivalent of studying the simplest possible living organisms to prepare for the later work of understanding more complex ones.

      I disagree. There is the possibility of taking a simple OS and examining it, or a real assembly language and using it. But rather than teaching something that would actually work on x86 architecture or such, a psudo-assembly is used that doesn't exist. It would be like taking the rules of biology, inventing a mythical single cell organism, and examining that fake creature in order to determine the rules. It could have just as easily been a real single cell organism, but isn't. And for no good reason.

    44. Re:Cruel and couldn't use a computer by andcal · · Score: 1

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

      There are no naturally occuring operating systems, computer languages, or hardware to study. If there were, we might study them like we study biology. As it is, operating systems, computer languages, and hardware was created by humans. We know the precepts used to design them, we know how they work, and we expect tomorrows versions to overcome today's limitations. So instead of just studying what has already been invented, computer science students study the underlying principles used in inventing what has been already been invented. If biology students were being taught with the explicit expectation that they would be creating new and better forms of life, biology might just be taught more like computer science.

      --
      --something witty
    45. Re:Cruel and couldn't use a computer by blackcoot · · Score: 1

      hence computer science taught at a university as opposed to programming taught at a trade school. there is a reason that physicists receive very different training from mechanical engineers who receive very different training from mechanics. the world has a place for all these people. i, however, have zero desire to be a mechanic.

    46. Re:Cruel and couldn't use a computer by blackcoot · · Score: 1

      it's called systems biology.

    47. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      Sounds like a typical computer science professor.

      Dijkstra was always in favour of calling the subject Computing Science, rather than Computer Science. If you want to know about computers, you should study electronics.

      That is for people who enjoy math and theory.

      Sounds like you've discovered the difference between fundamental and applied computer / computing science.

    48. Re:Cruel and couldn't use a computer by bondsbw · · Score: 1

      Typical snobbery. As long as you're learning the theory, why shouldn't you do something practical? I'm sick to death of academics who work their asses off to create some wild assed "teaching language" or "teaching OS" just to prevent you from ever actually getting to touch the real thing.

      Typical snobbery. As long as you're doing something practical, why shouldn't you learn the theory behind it? I'm sick to death of dime-a-dozen programmers who work their asses off to write unmaintainable, non-reusable procedural code in an object-oriented language because they never learned OOP.

      Those "teaching languages" you loathe are pure for a reason; they force you to learn something different so that you can decide when best to use procedural or object-oriented style (or any other for that matter) in a general purpose language. They are rarely ideal for the real world since general-purpose languages allow multiple styles and thus are more popular.

      As for a "teaching OS", would you rather your professor show examples using the source for an extremely simple OS, or tell you to read and learn the Linux kernel? And for that matter, when learning how a proprietary OS works, there is no source... thus, creating a "teaching OS" is necessary.

      --
      All my liberal friends think I'm a conservative, all my conservative friends think I'm a liberal.
    49. Re:Cruel and couldn't use a computer by wild_berry · · Score: 1

      Unfortunately, we English-speakers count list length in Natural Numbers, i.e. those from the set {1, 2, 3, 4, ...}, and it doesn't matter what numbering the elements of the list have. So your comment is wrong: the first item on your list is indexed with '0)', and I don't mind that. The length of your list is three items. Therefore the third item on your list is your claim that I've insulted a fairly decent mathematician. I didn't.

      I said that his insistence (in TFA) on formal methods is compromised when he himself doesn't rigorously bridge the gap between his indexes numbering a list and the natural counting of elements in the list. That or he should have written "the item marked (6) on my seven-element list is what I really want to talk about".

    50. Re:Cruel and couldn't use a computer by SgrA* · · Score: 1

      Sounds like my introductory biochemistry class.

    51. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

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

      That would be akin to a CS course where you don't examine any OS or assembly or whatever at all.

      Really, there is no such thing as a "fake OS". You may not study Linux or whatever right away, but a simpler, more basic system like Minix actually has advantages when you're just getting started - you won't get bogged down by all the complicated details.

      If anything, it's like studying bacteria instead of beginning with orang-utans.

    52. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      I feel your pain. I went to OSU too. There is a reason why a 3.5 was required to get into the CSE program 5 years ago and now it is a 2.0.

    53. Re:Cruel and couldn't use a computer by chthon · · Score: 1

      I think you are right. SICP is not only a CS book, but a rather practical one at that, once you get past the mathematical exercises.

    54. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

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

      I know that this is Slashdot and all, but if you actually RTFA you would read about how bad analogies can be when trying to describe new concepts by comparing them to old known ones.

    55. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      I think that you miss the point of the entire paper we're discussing; one of Dijkstra's main points was that by trying to impose these sorts of analogies onto computer science we artificially limit ourselves.

      In this case, comparing computational classes to a biology class that doesn't actually examine living organisms is very limiting. It makes the false assumption that the point of studying computing is to understand how computers currently work, in much the same way that the science of biology is intended to understand how physiological systems currently work.

      This is backwards. To really advance computer science, we need to understand computation first, and maybe later implement compilers or computers to run our computations.

      Perhaps I'm being too theoretical that I'm not clearly coming across, so indulge me with a practical example.

      When I was in college, I spent a lot of time in the labs, and helped many of other students write programs. I saw students who just didn't understand that they needed was to step back and understand what their program was really supposed to do. Instead, they would get stuck in the "compile, run, crash, fix immediate cause of crash, compile, run, crash again, fix next immediate cause of crash, compile ..." loop.

      The result of that sequence is a program that may happen not to crash and might even give a useful results for some inputs, but I wouldn't trust it. Nor would I trust the programmer who develops programs that way.

      This is a concrete example of why Dijkstra said that there shouldn't be an implementation of the programming language for students to test on. Some students need to be forced to reason things out, instead of relying on the computer to keep telling them when they guess wrong. This can be painful for the student at first, but in the end it becomes very empowering. That's why Dijkstra called his paper, "On the Cruelty of Really Teaching Computer Science".

    56. Re:Cruel and couldn't use a computer by Anonymous Coward · · Score: 0

      Did you read what Dijkstra had to say in his paper about reasoning by analogies?

      (BTW, I think a good CS program will have a mix of theoretical and applied CS)

    57. Re:Cruel and couldn't use a computer by DamnStupidElf · · Score: 1

      3) confusing computer scientists with English-speakers.

    58. Re:Cruel and couldn't use a computer by wild_berry · · Score: 1

      I doubt you'd disagree with my words if I did a s/English-speakers/spoken-language speakers/.

  8. Cruel to be kind by MosesJones · · Score: 5, Insightful

    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.
     

    --
    An Eye for an Eye will make the whole world blind - Gandhi
    1. Re:Cruel to be kind by 140Mandak262Jamuna · · Score: 3, Insightful

      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.

      --
      sed -e 's/Chuck Norris/Rajnikant/g' joke > fact
    2. Re:Cruel to be kind by Darth_Burrito · · Score: 1

      The aim of a really good degree is to be cruel

      There is a difference between something being cruel and something that is difficult or challenging. Any teacher who believes their goal is to be cruel should be fired. My greatest strides have always come from the work that came out of my home and not out of the classroom or even the work environment. The greatest aid in learning is the motivation to learn. Cruelty is not a good incentive for independent learning.

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

      Real world software development jobs are also a lot easier than rolling around naked through hot coals and velociraptors, but this isn't necessarily an optimal way of preparing someone for a career as a developer. I found a lot but not all of the theory I was taught in school to be irrelevant (axiomatic semantics, countability) while I was missing many fundamentals (usability, interface design, realistically modeled team work and project management).

    3. Re:Cruel to be kind by Anonymous Coward · · Score: 0

      Georgia Tech graduate found.

    4. Re:Cruel to be kind by jonaskoelker · · Score: 1

      All these dumb kids got through high schools with endemic grade inflation

      I only hear about that being a problem in the US.

      I've TA'ed in a freshman course (introductory programming 2) here in Denmark, and my group of students seemed to be doing some real work when they showed up for lab exercises. Sure, some of them caught a WoW-break some or all of the time; their loss. But most were studious, and you can't keep all the slackers out.

  9. What's a Computer? by Rary · · Score: 1

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

    So, his Macintosh wasn't a computer?

    --

    "You cannot simultaneously prevent and prepare for war." -- Albert Einstein

    1. Re:What's a Computer? by mangu · · Score: 1

      his Macintosh wasn't a computer?

      It could have been a raincoat...

    2. Re:What's a Computer? by morgan_greywolf · · Score: 1

      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.

    3. Re:What's a Computer? by morgan_greywolf · · Score: 1

      Grrr...Slashdot ate my link.

    4. Re:What's a Computer? by TheRaven64 · · Score: 2, Insightful

      Dijkstra felt that computer science is about computers as much as astronomy is about telescopes -- IOW, not much

      Spoken like someone who has never met an astronomer. Any half-competent astronomer has a detailed grasp of optics and will have built at least one reflecting telescope (and maybe a refracting one as a hobby). Telescopes are very important to astronomy - the subject would barely exist without them - but they are not the focus of it. Similarly, computer science would be a very dull subject to study if computers didn't exist, and understanding computers is very important to understanding computer science. Viewing computer science as the study of computers, however, makes as much sense as viewing astronomy as the study of telescopes.

      --
      I am TheRaven on Soylent News
  10. The REAL cruelty is... by Anonymous Coward · · Score: 0

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

  11. Professionals should know their tools by mangu · · Score: 4, Insightful

    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.

    1. Re:Professionals should know their tools by internerdj · · Score: 1

      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.

    2. Re:Professionals should know their tools by thermian · · Score: 5, Insightful

      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.

      --
      A learning experience is one of those things that say, 'You know that thing you just did? Don't do that.' - D. Adams
    3. Re:Professionals should know their tools by NotQuiteReal · · Score: 1

      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.

      --
      This issue is a bit more complicated than you think.
    4. Re:Professionals should know their tools by jazzduck · · Score: 5, Funny

      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.

      --
      A cat is no trade for integrity!
    5. Re:Professionals should know their tools by WhiplashII · · Score: 1

      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...

      --
      while (sig==sig) sig=!sig;
    6. Re:Professionals should know their tools by thermian · · Score: 1

      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.

      --
      A learning experience is one of those things that say, 'You know that thing you just did? Don't do that.' - D. Adams
    7. Re:Professionals should know their tools by Anonymous Coward · · Score: 0

      I'd say you can blame the department, because if the student is not prepared to work in their field (due to a lack of theoretical or practical knowledge), then they shouldn't be given a degree.

      So, the department isn't at fault for the student not *learning*; the department is at fault for *certifying* a student who hasn't learned, by giving them a certificate, diploma or degree.

    8. Re:Professionals should know their tools by Alpha830RulZ · · Score: 1

      This isn't unique to CS. There are legions of students in all disciplines who got good grades, but are useless, and a fair amount who didn't get good grades, but are nonetheless the effective, 'go-to' guys in the real world. I doubt that it's efficiently possible to design a curriculum to completely avoid this. Nor should we. Good students do not always make good employees, and good employees aren't always the good students. It isn't the job of universities to make good employees, nor to guarantee that a given grade represents anything more than mastery of the class material. It's up to the student to use the material to become a good engineer.

      --
      I was taught to respect my elders. The trouble is, it's getting harder and harder to find some.
    9. Re:Professionals should know their tools by chthonicdaemon · · Score: 1

      "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."

      And I suppose we should be using c++ instead of languages that were designed explicitly with our needs in mind? In Matlab (and Fortran) I get out-of-the-box support for imaginary numbers and vectorised operations, even varying levels of support for matrix math. Matlab and Fortran are homeomorphic, so there's little that stops me from porting my Matlab routines to Fortran when I need more speed. Every single test I have done with Fortran vs c++ has shown me that I need to jump through a lot of loops to get the same amount of speed out of c++ as I get with very little effort from Fortran.

      I will grant that the object systems in both those languages are limited (in Forrtan's case at least they have chosen to restric the object stuff to things they can expect efficient compiler support for), and I will grant that Excel is not the best tool for large-scale numeric work, but I think there is no real reason to avoid purpose-made tools in favour of generic tools when you just want to get the job done (Excel for instance is great for 'playing' with a problem interactively).

      As an aside: I know many languages, have programmed significant programs using several paradigms, and I have learned that one language is never going to solve all your problems. It's better to know many and use the right tool for the job. So I use grep, sed, awk, bash, python, fortran, matlab and a bit of haskell and lisp for the problems they solve well, and I advise people to find out what problems languages solve well before writing them off. If that was your point (the try to do everything part), then I agree with you, otherwise you might want to look into the tools you seem to be dissing again.

      --
      Languages aren't inherently fast -- implementations are efficient
    10. Re:Professionals should know their tools by Anonymous Coward · · Score: 0

      Exactly. I am in Condensed Matter physics - most of the stuff is fourier transformed/imaginary and carries several indices by nature. And most of it parallelizes easily within those indices.
      Using Fortran makes that a) really easy and b) pretty fast.
      I do not need fancy objects, methods, classes, regex(*), whatever. I need something that can do non-sparse matrix manipulaton with a rank of 10k+ fast and transparently. And do that for several thousands-millions of iterations. Where I can almost literally transpose my formulas. Which runs without modification reasonably fast on Opterons, Xeons, Alphas, PPC, Intel Atom [EEE], C2D, whatever, because I can - and want to - easily saturate any given computing resources.

      Yes, keeping it readable (so the next PhD candidate can use it) requires some basic coding discipline. But if it takes 2 more days to develop than the corresponding Java/Phyton/xxx code but runs 200+ 4 week calculations 30% faster I am more than happy to spend that time.

      (*) Okay, I need regexes for data analysis and manipulation. But that is what Perl and Phyton are made for.

    11. Re:Professionals should know their tools by Anonymous Coward · · Score: 0

      Except that's bullshit, because we're teaching "Computer Science", not "How To Be A Code Monkey". I've never known any amazing programmers who were bad at CS, but I've known some perfectly good ones who would deserve to fail any decent CS curriculum.

  12. the greatest computer scientist to never own a com by Anonymous Coward · · Score: 0

    Alan Turing couldn't have owned a computer.

  13. Handwriting? How about a Font! by JoshDM · · Score: 4, Interesting

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

  14. Uh... by cwAllenPoole · · Score: 1

    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.

    --
    http://www.allen-poole.com/
    1. Re:Uh... by Anonymous Coward · · Score: 0

      You sir are right. It is a pity almost nobody else realizes the scintillating intellectual atmosphere of scientific inquiry that permeated the Middle Ages. Where be the Inquisition when you need them?

    2. Re:Uh... by maxume · · Score: 1

      There is no such thing as a 2 apple.

      Sure, you can have a group of 2 apples, but it isn't a 2 apple.

      --
      Nerd rage is the funniest rage.
    3. Re:Uh... by cwAllenPoole · · Score: 1

      It is a particular contextual redefinition when dealing with arrays. apple a vs apples[] a;

      --
      http://www.allen-poole.com/
  15. Cruelty across the board by Anonymous Coward · · Score: 0

    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)

  16. Professionals should know their math. by Ostracus · · Score: 1

    "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.

    --
    Shai Schticks:"You don't make peace with friends, you make peace with enemies"
    1. Re:Professionals should know their math. by astrodoom · · Score: 1

      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.

    2. Re:Professionals should know their math. by maxume · · Score: 1

      Math and numerical analysis ( http://en.wikipedia.org/wiki/Numerical_analysis ) are different things. Or that is, numerical analysis is a very specific type of mathematical analysis. I took a class on numerical methods as a elective in my fourth year of my engineering degree. There were about 45 people who took a class like that in a graduating class of about 1,000.

      I had dozens of hours of other classes that talked about mathematical analysis, but that was the only class I had that really dealt with numerical analysis (other than my 300-level fluid mechanics class, but that was more about understanding what the software was doing than it was about implementing it).

      --
      Nerd rage is the funniest rage.
  17. Do you really need that CS degree? It depends.... by zerofoo · · Score: 4, Insightful

    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).

    -ted

  18. His home university is just slowly recovering by Anonymous Coward · · Score: 1, Interesting

    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.

    1. Re:His home university is just slowly recovering by mbone · · Score: 1

      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).

    2. Re:His home university is just slowly recovering by Carewolf · · Score: 1

      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.

      The tools of the trade is not the trade. Computer Science is not about computers, but they are an important tool in exercising much of the field. Just like telescopes in astronomy. We are talking about separating, what is merely "tools" and what is the central knowledge of CS. Using emacs and latex is tool knowledge, so is any knowledge of any specific computers. The central knowledge is the abstract knowledge that applies to all computers.

    3. Re:His home university is just slowly recovering by smoker2 · · Score: 1

      Hah, so the tool is more important than the subject you need the tool for ? Astronomers study the stars, their tools are telescopes (amongst others). The stars will still exist even without telescopes. Computer scientists study the application of logic in order to solve problems, and their tools are computers. The logic will still exist even if a computer were never built. But a specific high level language is pointless without a computer.
      An elegant solution is elegant whichever computer language or OS it uses.

    4. Re:His home university is just slowly recovering by MrMr · · Score: 1

      Astronomers need to use a telescope and understand its operation
      I didn't. In 3 years of astronomy study, all data collection and telescope handling was done by professionals.
      The only optics I handled physically or intellectually was at the basic physics course.

  19. Recursive Descent by tomhath · · Score: 2, Insightful
    "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.

    1. Re:Recursive Descent by russotto · · Score: 2, Interesting

      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?

      When I was in the CS curriculum in the University of Maryland shortly after the publication of this paper, one of the mandatory freshman CS courses took this approach.

      The fatal problem of the approach quickly became apparent: the formal specification had to be as detailed as the program, the process of proving the program met the specification was just as complex _and error-prone_ as the process of writing the program in the first place.

    2. Re:Recursive Descent by DamnStupidElf · · Score: 1

      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?

      It's just as hard to prove that a hacked together piece of kludge is what the customer wanted. The customer is always wrong.

      Formal verification of code with regard to a formal specification requires a programmatic proof verifier that can examine both the code and the specification and use formal logic to prove their equivalence. A proof of correctness for the verifier itself is handy; it can verify its own correctness with regard to its own formal specification, which ultimately must be verified by humans (or by some simpler automated proof system that's easier to verify).

      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.

      Automatic testing is not formal verification.

  20. Real-world cruelty by Ukab+the+Great · · Score: 2, Funny

    "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?

    1. Re:Real-world cruelty by Darth_Burrito · · Score: 2, Funny

      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?

      Many of the professors exist in a world where faculty is king, ie in charge of every aspect of the business. Therefore not receiving inputs in the desired fashion would be unacceptable and rejected outright.

  21. GIGO by TheWoozle · · Score: 3, Insightful

    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.

    --
    Insisting on "correct" English is like saying that there is only one, definitive recipe for chili.
    1. Re:GIGO by TheSunborn · · Score: 1

      The programmer should first writing a formal description of the desired system, and then write an program that is equal to that description.

      And the system that the program is to work in(Implement) might be "which is inherently illogical, inefficient and rife with nonsens"
      but that does not prevent the developer from making a formal description of it.
       

    2. Re:GIGO by Fallingcow · · Score: 1

      The programmer should first writing a formal description of the desired system

      What if I write my formal description in C++?

      Oops, I just wrote the program, too!

      (I'm partly kidding. Partly.)

  22. There aren't entire majors... by Renegade+Iconoclast · · Score: 1

    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!

    1. Re:There aren't entire majors... by blueg3 · · Score: 1

      In fact, there is a single degree for Electrical Science and Mechanical Science. Usually it's referred to as "Physics". If that's too applied for you, you can go into Mathematics.

      As far as I know, most schools that offer CS degrees also offer a degree in software engineering (however it may be referred to).

      If kids with degrees don't know how to do multithreading, their school failed or they weren't paying attention. (I'd bet the latter.) It's a fairly standard part of CS. I'd even say that people with degrees are better prepared to do multithreading, in the fantasy world where they deserve their degrees and paid attention, since they should actually know how to apply different exclusion mechanisms and know how to identify potential race conditions and deadlocks.

    2. Re:There aren't entire majors... by Renegade+Iconoclast · · Score: 1

      Didn't wanna get your hackles up, I'm not saying everyone with a degree is an idiot, or that every college is brain-dead.

      I'm just saying that a degree is not particularly predictive of hirability, in my experience. Then again, I don't see all the resumes, I just interview the ones who make it in the door.

    3. Re:There aren't entire majors... by Dragonslicer · · Score: 1

      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.

      The answer I came up with when I was in school was that the professors were all mathematicians that wanted to keep computer science "pure" by trying to make it as close to mathematics and as far away from engineering as possible.

    4. Re:There aren't entire majors... by blueg3 · · Score: 1

      In practice, CS seems to be a popular and easy degree -- I wouldn't say that having a CS degree is predictive of anything in particular. Lots of people I know that ended up with degrees couldn't CS their way out of a paper bag.

  23. Self-confidence by dgenr8 · · Score: 3, Insightful

    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.

    1. Re:Self-confidence by bradley13 · · Score: 1

      I only knew him rather briefly, towards the end of his career. But my impression was this: Dijkstra was a clever guy who happened to be in the right place at the right time. He was there when computer science was just taking off, he loved puzzles, and "voila" he was in. The fact that his ideas were largely unrealistic and unpractical has to do with him being a "puzzler" at heart.

      --
      Enjoy life! This is not a dress rehearsal.
    2. Re:Self-confidence by tucuxi · · Score: 1

      Written in '88, it seems to me to have aged quite well. And for all the intellectual smugness, there a few tidbits worth keeping.

      The 9 orders of magnitude that have to be spanned when thinking on computation are quite true. The gap may have expanded with even faster computers and more ambitious projects. And the fact that thinking discrete is very different from thinking continuous is also well made. Knowing what is difficult is a good protection against overconfidence. One of the hard lessons of computers is that what you think it does and what it really does are not always in sync.

      On the educational aspect, dumbing things down, if done only for the heck of it, does result in dumber students. If all you meet are small, uniform, incremental steps -- how can you expect to learn to leap?.

      Yes, hammering only theory and proof-of-correctness to freshmen is indeed cruel and, furthermore, ineffective (except for learning algorithmic thought). As other posters have said, business requirements are not amenable to formal proofs. Ivory-towerness aside, I think it makes for a provocative read. And if profs are not allowed to shout from the tower once in a while, they would go mad.

    3. Re:Self-confidence by Wonko+the+Sane · · Score: 1

      business requirements are not amenable to formal proofs.

      But try to imagine a world in which your typical business major could specify business requirements that were amenable to formal proofs...

    4. Re:Self-confidence by geminidomino · · Score: 1

      I'll content myself with imagining a world in which your typical business major could spell "formal proof."

    5. Re:Self-confidence by blonkm · · Score: 1

      eh.. form all proof? four mall prove? formal roof? vormel broof?

  24. Anthropomorphic Descriptions by SageinaRage · · Score: 2, Insightful

    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.

    1. Re:Anthropomorphic Descriptions by Max+Webster · · Score: 4, Insightful

      I think the problem is the false assumptions and analogies that get introduced by these lines of thinking. If a network is "this guy talking to that guy", your thinking will be constrained by what you know about human conversation. If there's a problem, someone can talk louder, slower, etc. and the analogy holds. But if the solution involves something that has no equivalent in the day-to-day world, how are you going to conceptualize it?

      My pet peeve, that descends from this same idea, is from the teaching of object orientation. A car is a type of vehicle; a truck is a type of vehicle; they both have wheels; maybe the number of wheels is different; maybe each has a different turning radius or procedure for backing up.

      Great, now you understand inheritance, polymorphism, member functions, etc. However, in practice, you use object orientation to avoid zillions of "if" statements, special case code, large blocks of almost-but-not-quite duplicated code.

      In my experience, someone who learned OO by simple analogies is likely to be locked into thinking "I have to write every program by making a tree of classes like with the cars and trucks". Rather than "there are different ways to structure the code, and a good OO way will get rid of a lot of branching, magic numbers, and redundant code".

    2. Re:Anthropomorphic Descriptions by tucuxi · · Score: 1

      I think he is just mad with people getting away with "oh, yes - there's a bug somewhere, must have crept in while I was not looking". Dijkstra had a quite extreme view on programmer errors.

    3. Re:Anthropomorphic Descriptions by jlowery · · Score: 1

      One can turn the analogy on its head and ask why we explain the actions of humans behaviorally? The brain operates on computational principles, though the mechanisms are quite different. Sure, the human gets the answers quite wrong occasionally, but that's either bugs in the programming, bugs in the hardware, or bugs introduced by external factors (like alcohol). I had multiplication tables drilled into me since grade 2, yet I still have trouble remembering what 8x7 equals (bug in the hardware).

      The reason we look at humans behaviorally is because their computational mechanisms are so complex as to be unfathomable. The same can be said of modern operating systems and networks. True, we have the ability to look at the code of a computer program and not the human brain, but no one had the time or intellectual capacity to totally grok 10-20 million lines of code.

      So many times the reasonable fall back is to characterize a complex program's behavior and guess at the underlying problem and just work around it. Most of us are not in the business of white box testing open source software or constructin reproducable test cases-- we have to get something up and running in time for it to be of value to somebody somewhere. It's not laziness or the incapacity of fuzzy thinking, it's expediency.

      --
      If you post it, they will read.
    4. Re:Anthropomorphic Descriptions by lennier · · Score: 1

      Quite true. The "cars and trucks" or "animal" kind of tutorial OOP metaphor, understandable as it seems, actually seems to be one of the worst abuses of OOP; people take the advice literally, and write all these hardcoded class hierarchies of their business objects.

      Without realising that in the real world, a "customer" might morph into a "user" just by signing a document, but if they've been created as CustomerPerson and UserPerson entities by someone diligently following Object-Oriented Design methodology, there's no way the system can make that happen, because objects can't change their class at runtime.

      "However, in practice, you use object orientation to avoid zillions of "if" statements, special case code, large blocks of almost-but-not-quite duplicated code."

      And then in actual actual practice, what we often end up doing in OOP is the reverse: duplicating, for example, a SQL database schema in a ton of cut-and-pasted boilerplate 'business object' class definitions.

      And then we compound the pain with that final abomination of OOP 'best practice', getter and setter methods. Whose whole reason for existence is to be a cause of almost-but-not-quite-duplicated code!

      Oy. We do it to ourselves, and that's what really hurts.

      And consultants still get to sell Object Oriented Analysis and Design as if it's *not* snake oil.

      --
      You are not a brain: http://books.google.com/books?id=2oV61CeDx-YC
    5. Re:Anthropomorphic Descriptions by jhantin · · Score: 1

      I'm probably either preaching to the choir or feeding a troll, but I'll join in anyway. :-)

      Quite true. The "cars and trucks" or "animal" kind of tutorial OOP metaphor, understandable as it seems, actually seems to be one of the worst abuses of OOP; people take the advice literally, and write all these hardcoded class hierarchies of their business objects.

      Without realising that in the real world, a "customer" might morph into a "user" just by signing a document, but if they've been created as CustomerPerson and UserPerson entities by someone diligently following Object-Oriented Design methodology, there's no way the system can make that happen, because objects can't change their class at runtime.

      Cats don't become dogs. Prospects do occasionally become customers. If you try to model that with inheritance on Person you're doing it wrong. Add a role or state or something to the Person instead. Better yet, add a collection of purchase transactions with timestamps, entitlements with validity intervals, or whatever else you need. (I say this because even experienced data modelers tend to make a mess when dealing with temporal data, regardless of the data representation paradigm.)

      "However, in practice, you use object orientation to avoid zillions of "if" statements, special case code, large blocks of almost-but-not-quite duplicated code."

      Method dispatch is the defining control structure of object-oriented code. It's supposed to replace conditionals.

      And then in actual actual practice, what we often end up doing in OOP is the reverse: duplicating, for example, a SQL database schema in a ton of cut-and-pasted boilerplate 'business object' class definitions.

      If you're treating the boilerplate as source code, you're doing it wrong. Use compile-time or run-time code generation and don't hand-edit the code generator output. It also doesn't help our sanity that using a database usually means connecting two languages with radically different type systems via remote calls; generated stubs are often used as a sort of transcription of the foreign types.

      And then we compound the pain with that final abomination of OOP 'best practice', getter and setter methods. Whose whole reason for existence is to be a cause of almost-but-not-quite-duplicated code!

      Properties are a weakness in an object-oriented design, not a best practice. Move that logic into the object that has the fields you need. With apologies to the U.S. military: "Tell, don't ask." Also, much of the ink spilled on 'best practice' is a waste, since much of it is motivated by a desire to replace thinking and comprehension with adherence to policy -- or to sell snake oil.

      Oy. We do it to ourselves, and that's what really hurts.

      And consultants still get to sell Object Oriented Analysis and Design as if it's *not* snake oil.

      The unfortunate part of consulting is that it's mostly salesmanship, and if you don't have a real solution you still have to eat, so it's unsurprising that many consultants sell snake oil to make up the shortfall.

      --
      ...when you're writing a game...tweak the difficulty of "Easy" to something [your mother] can cope with. -- onion2k
    6. Re:Anthropomorphic Descriptions by jonaskoelker · · Score: 1

      But if the solution involves something that has no equivalent in the day-to-day world, how are you going to conceptualize it?

      That's actually not that big of a problem. You just talk about the system it terms of the system instead of the analogy.

      What's worse is the other way: when you conclude something in the analogy that doesn't hold true in the system.

      You may know BlueJ. If you don't: it's a text editor with a compile-java button (somehow the acronym doesn't come out I D E...). It also has an "Object workbench", where you can create objects and invoke methods on them, similar to the python interpreter (or irb, or in a limited sense gdb) except with a GUI. Objects show up as little red boxes with rounded corners and a menu listing their methods.

      Around three weeks into introductory programming (I TA'ed it), you come to the point where you're writing "foo = new Foo();" in your code. That's when I discovered how interlocked the concept of an object had become to the stimulus of a red box in the mind of my students. "But when I write `new', there's no red box; where's the red box? How do I call stuff on it if there's no red box?"

      It was a horror to watch. Not that I blame the students of course; they were third-year math-econ students, the course was mandatory and they worked hard to earn a well-deserved passing grade.

      I still don't understand the decision to try to wrap programming into something "easy-to-grasp" that you have to break out of straight away.

      My pet peeve, that descends from this same idea, is from the teaching of object orientation.

      Tell me about it. Especially when "objects as a model of real-world things" is stressed and stretched. I'm always thinking to myself "so what does struct tcphdr { u32 seqno; u32 ackno; ...} model?" and I have yet to come up with a satisfying answer. The electrons on the wire? The electrons in RAM? What properties of them are you modeling? What meaning do these electrons have other than that imposed on them by the RFC?

  25. Dijkstra is the typical head-up-arse CS crack by Qbertino · · Score: 3, Insightful

    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.

    --
    We suffer more in our imagination than in reality. - Seneca
    1. Re:Dijkstra is the typical head-up-arse CS crack by russotto · · Score: 5, Funny

      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.

      You have been trolled (by Dijkstra).

    2. Re:Dijkstra is the typical head-up-arse CS crack by Anonymous Coward · · Score: 0

      Hey, dumbass--he was talking about BASIC in the context of GOTO. GOTO is provably bad, and people who cut their teeth on BASIC with GOTO have a hell of a time learning a structured language.

    3. Re:Dijkstra is the typical head-up-arse CS crack by Fallingcow · · Score: 2, Insightful

      I like the part where he complained about kindergarten teachers bootstrapping kids into the unnatural, abstract world of mathematics with *gasp* addition of one pile of apples to another.

      He's clearly never tried to teach a 5-year-old about math. Kids can get stuck at very low levels of understanding if you don't guide them up the ladder of abstraction a bit, and examples like that are key.

    4. Re:Dijkstra is the typical head-up-arse CS crack by PCM2 · · Score: 1

      people who cut their teeth on BASIC with GOTO have a hell of a time learning a structured language

      Like who? You're probably talking about any computer programmer born between 1968 and 1988, here. How many of them are still writing C64 BASIC with line numbers?

      --
      Breakfast served all day!
    5. Re:Dijkstra is the typical head-up-arse CS crack by AVee · · Score: 1

      *grin* Arrogance is measured in nano Dijkstras

      But regardsless of the style, he was right about that one. But he wasn't talking about the basic you probably know, but about the first totally line based versions of basic. No functions or subroutines, just "GOTO linenumber", for program flow. Indeed, no such thing as a function you can just call from another part of your code, just GOTO. That's totally unmaintainable and very error prone for anything larger 50 lines of code. But worse, it does promote spagetti code instead of promoting structure. If that way of thinking is the basis for your programming efforts your are indeed bound to fail when trying to write anything significant.

      It may not be entirly irrepairable though...

    6. Re:Dijkstra is the typical head-up-arse CS crack by lennier · · Score: 1

      I wonder how Dijkstra learned maths?

      --
      You are not a brain: http://books.google.com/books?id=2oV61CeDx-YC
    7. Re:Dijkstra is the typical head-up-arse CS crack by Anonymous Coward · · Score: 0

      Sounds like you're a complete fucktard idiot then.

  26. I don't understand by russotto · · Score: 2, Funny

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

    1. Re:I don't understand by Anonymous Coward · · Score: 0

      Can someone explain it to me with a car analogy?

      No use explaining cars to a guy with a medieval mentality. Horses and donkeys *may* just work, though.

    2. Re:I don't understand by Anonymous Coward · · Score: 0

      Basically he is saying that computer programming is just like building a car, except that there is no car, and it's not like building one.

  27. Depends on the school by RingDev · · Score: 1

    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.

    -Rick

    --
    "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    1. Re:Depends on the school by ROBOKATZ · · Score: 1
      if they try to answer the "Swap the values of A and B" with out creating a 3rd variable

      Why would you even ask that if you weren't looking for a "clever" answer? Or are the caliber of people you're looking for so stupid that many of them might not know how to swap the values of two variables?

      Here's another good test question, "you are writing a screening test. Do you put trick questions on it?"

    2. Re:Depends on the school by RingDev · · Score: 1

      Why would you even ask that if you weren't looking for a "clever" answer? Or are the caliber of people you're looking for so stupid that many of them might not know how to swap the values of two variables?

      The caliber of people I'm looking for know how to swap the value of two variables.

      The caliber of people applying do not necessarily know how to swap the value of two variables.

      It is not a trick question. It is a screening question, one of many, used to quickly weed out people who do not have the technical knowledge or logic processing ability to handle the requirements of the job.

      Also, if you ever see a screening question that has a compilation error, it is also likely not a trick question. It is probably a type-o or mistake by the test writer. Indicate the mistake in the margine, then give the answer that you believe fulfills the intent of the question.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    3. Re:Depends on the school by ROBOKATZ · · Score: 1

      It just seems to me like anyone not capable of answering that question would also not be capable of answering just about anything more complex. So if your screening test is actually targeted to a higher-level recruit, why even bother putting that question on the test? It should be pretty clear from the other responses when a candidate is grossly incapable.

    4. Re:Depends on the school by RingDev · · Score: 1

      Different positions have different requirements.

      The most recent test I've seen had a variety of prac app questions on it. Including one that had a SQL question to hand write a 4 table join query a long with a few twists.

      We were just looking to hire a junior body in as well. They all took that same test. Some people couldn't get past the first question. Some people couldn't get past a simple loop. Some people couldn't get past the easy SQL statement. And some couldn't get past the "hard" SQL question.

      But we weren't looking for a SQL pro who could nail recursion and reflection, we were looking for an entry level person. So if they could get the easy questions (a=b, loops, etc...) they would have the technical requirements to fulfill the role.

      That said, the A=B question is the bottom of the line. If you can't pass that, you need to get more training and experience on your own dime. Answering the A=B question with out a 3rd variable screams 'cowboy'. I've worked with some extremely talented cowboy coders over the years, and I would gladly have traded any of them in for a lesser coder who can follow standards.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
  28. If all we taught was theory... by Anonymous Coward · · Score: 0

    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.

    1. Re:If all we taught was theory... by blueg3 · · Score: 1

      It may surprise you to discover that the first actual computers were built by people who were trained in neither practical nor theoretical computer science. (They were, for the most part, physicists and electrical engineers.)

      In fact, practical computer science ("programming") is almost useless if you want to build an actual computer. It's also useless if you want to deal with a theoretical computer.

      So no, I'd say that if all we taught in CS was theory, we'd still have actual computers.

  29. What a pompous windbag by mbone · · Score: 3, Interesting

    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.

    1. Re:What a pompous windbag by freedom_india · · Score: 1

      That pompous windbag single handedly brought computing to modern age much like American Pie brought fun part of college life into movies.
      He was not a windbag: he was just forceful in his thoughts and knew what he talked about.
      And unlike today's lawsuit-fearing professors he did not suffer idiots and morons.
      The fact he wrote so much about computing without owning a computer is like Newton writing so much about Gravity without experiencing the apple hitting his bald (and jelly-filled) cranium...

      --
      "Doing what i can, with what i have." ~ Burt Gummer
    2. Re:What a pompous windbag by evanbd · · Score: 1

      They develop an intuition for quantum mechanics, but that intuition is not based on analogy to previously known things. Developing that intuition is hard, though obviously not impossible. Dijkstra isn't saying you can't understand radical novelties; he's saying that attempting to shoehorn them into bad analogies doesn't help that understanding. I'd say that's rather obviously the case with quantum mechanics.

    3. Re:What a pompous windbag by geminidomino · · Score: 2, Funny

      That pompous windbag single handedly brought computing to modern age much like American Pie brought fun part of college life into movies.

      I've got Karen Allen, Kevin Bacon, and the estate of John Belushi on Lines 1 through 4, and they'd like a word with you...

    4. Re:What a pompous windbag by Fallingcow · · Score: 1

      Though it looks to me like a good portion of this paper is rubbish, I will admit:

      It took me way, way longer to grok OOP than it should have, due in large part to an over-reliance on analogy in the books I was reading.

  30. Sorta Kinda Yeah by Aaron_Pike · · Score: 3, Insightful
    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.

    1. Re:Sorta Kinda Yeah by AVee · · Score: 1

      The point of the excersise is to complete the program before, test the program and debug the program before you compile and run it. These are very usefull skils. I'm constantly amazed by the inability of a lot of programmers to spot bugs in code without a debugger. Writing the program without instantly compiling and running it teaches you to 'run' the program in your head and that will allow you to spot errors before they even happen. That's a skil which will hugely improve the quality of the software you write.

      It doesn't have to stop you from running the end result just to see it work though.

  31. Back to the future by Bucc5062 · · Score: 4, Interesting

    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.

    --
    Life is a great ride, the vehicle doesn't matter
  32. Exactly by chfriley · · Score: 2, Interesting

    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?"

    1. Re:Exactly by chfriley · · Score: 1

      It ate my greater than/less than above. Oh well.

      One more thing, there was a reason that the CS department was (is?) in the APM (Applied Math and Physics) building at UCSD. A lot of CS theory is just math.

    2. Re:Exactly by ceoyoyo · · Score: 1

      Close, but not quite. Here's the full analogy:

      Computer scientist is to software engineer is to programer

      as

      physicist is to electrical engineer is to electrician.

      The physicist is the one you want doing research in theory and the basic science. The electrical engineer is the one who takes the physicist's advances and designs something around them. The electrician is the one who takes his wire cutters and soldering iron and builds it.

      The computer scientist is the one who does the research in theory and basic science. The software engineer is the one who takes those advances and designs things using them. The programmer is the one who actually builds those things.

    3. Re:Exactly by Anonymous Coward · · Score: 0

      I don't disagree, but in practice the lines are blurred (or non-existent) in the software fields. I talked to the guys who wired my house while it was being built, and I'm certain that they were not EEs, let alone physicists. I would bet that most EE majors are not also physics majors and vice-versa, although there are probably a few students double-majoring in both; almost none of them will ever wire a home (ignoring very basic home maintenance). However, it's generally expected that any one of "computer scientist"/"software engineer"/"programmer" must fulfill at least two of those roles, and often all three.

      [pedant-repellant: I know electricians do more than just wire houses; that's merely an example]

      - T

    4. Re:Exactly by Anonymous Coward · · Score: 0

      FWIW I think "IT worker" compares better to "electrician".

  33. Dijkstra has at least half a point. by Dr.+Manhattan · · Score: 1

    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?

    As Dijkstra put it, "...because persons exist and act in time..." And his claim was that using 'operational reasoning' was a 'waste of mental effort', and he used his domino problem to illustrate a problem where 'operational reasoning' is particularly ill-suited.

    However, not all problems are like that, and humans have - in essence - hardware-accelerated modules for performing time-and-agent-based operational reasoning. Dijkstra was half-right: "refusal to exploit this power of down-to-earth mathematics amounts to intellectual and technological suicide", but also half-wrong - not all problems succumb so directly and easily to "down-to-earth mathematics", and not using the human talent for 'operational reasoning' is also "intellectual and technological suicide".

    --
    PHEM - party like it's 1997-2003!
  34. Re:Handwriting? How about a Font! by Anonymous Coward · · Score: 0

    Tinyurl? That isn't the shortest path to the link, y'know.

  35. Programming tools. by Arthur+B. · · Score: 1

    Dijkstra mocks concerns about the lack of "programming tools". I think he is wrong on this one. Refactoring can be thought of as a programming tool, and it is a very useful one.

    --
    \u262D = \u5350
  36. Starting low level vs meet-in-the-middle by tucuxi · · Score: 3, Insightful

    I think both approaches (top-down and bottom-up) make sense. You learn C very fast if you can think of it as a high-level assembler. And learning assembler teaches you a lot about what computers are all about and what they can and cannot do.

    But learning algoriths on C or other low-level, manage-your-own-memory languages is unnecessarily painful and error-prone. The algorithm exists independently of a specific language incarnation. Learn the algorithms in a language that makes it easy to concentrate on the problem and not get lost in a thousand small implementation details.

    You reach enlightenment when you can bridge the gap from very low level to the highest levels. But it is folly to try to do everything at once.

    1. Re:Starting low level vs meet-in-the-middle by blair1q · · Score: 1

      "You learn C very fast if you can think of it as a high-level assembler."

      ((void (*)())FAIL)();

      If you can't get more out of C than what you find in an assembler, you never learned C properly.

      BTW, 85% of C++ coding skill is C coding skill. And 115% of Java coding skill is C coding skill.

    2. Re:Starting low level vs meet-in-the-middle by ownermachina · · Score: 1

      > You reach enlightenment when you can bridge the
      > gap from very low level to the highest levels.
      > But it is folly to try to do everything at once.

      Enlightenment? A quick satori perhaps...
      Only when doing everything at once by mastering massive autonomous distributed parallel learning networks you truly enter Nirvana.

    3. Re:Starting low level vs meet-in-the-middle by shutdown+-p+now · · Score: 1

      BTW, 85% of C++ coding skill is C coding skill. And 115% of Java coding skill is C coding skill.

      Ah, you must be one of those guys from the "C++ is just C with single-line comments" school - the kind that I had to clean up C++ code after. *sigh*

      In my experience, 50% of C++ coding skill is learning not to do things the way they're done in C. The other 50% is learning how they are actually done (truly understanding templates and STL, learning to use and love RAII over explicit cleanup and exceptions over error codes, etc).

    4. Re:Starting low level vs meet-in-the-middle by Anonymous Coward · · Score: 0

      lis r0,FAIL@ha
      lwz r0,FAIL@l(r0)
      mtlr r0
      blrl

      Anything you can do in C you can do in assembler; this much should be obvious. The opposite is not true. C is a better human notation for representing higher-level concepts.

      Anything you can do in Java you can do in C; this should also be obvious. Lacking a true Java machine, the opposite is also not true. I do not think Java is a significantly better human notation for a representing higher-level concepts.

    5. Re:Starting low level vs meet-in-the-middle by tucuxi · · Score: 1

      Try to teach pointers to someone who is not familiar with the concept of memory as a large, one-dimensional string of bytes - where a byte can contain a part of an sizeof(int)-byte integer, or a single character, or a part of a sizeof(void *)-byte memory address to yet other interesting bytes.

      Try to explain stack corruption to someone who does not understand the concept of pushing things into the stack when you call a function and popping them back out when you return, and using that same stack space to store your local variables.

      If you can't get more out of C than its more convoluted syntax, you never learned C properly.

    6. Re:Starting low level vs meet-in-the-middle by Agronomist+Cowherd · · Score: 1

      No, I think his point was good. If you're spending all your time on "templates and STL, learning to use and love RAII over explicit cleanup and exceptions over error codes" you're spending all your time on syntax. The goal is to get something done. If what you're getting done isn't hard enough that it takes 85% of your time, you aren't doing anything interesting. Therefore you can spend all your time debating the best use of templates.

      I love templates, the STL, RAII (I find exceptions overrated, at least as used in many libraries). They make writing the code that does the work simpler, when they're designed correctly. Nonetheless, the job at hand is the actual work, and that's the part that takes up most of the code, and that part is pretty much the same in any language. The nifty features let you get as much of the language out of your way as possible, freeing you to do the actual work.

      Java sucks. It's starting to suck less. The libraries suck the worst. Over complicated, under documented, and missing just as you get to the part you need. But overall, it sucks.

      --
      -DwS
    7. Re:Starting low level vs meet-in-the-middle by danieltdp · · Score: 1

      But if you try to learn both you risk becoming like a duck: you can swim, fly and run, but do none well

      --
      -- dnl
    8. Re:Starting low level vs meet-in-the-middle by shutdown+-p+now · · Score: 1

      No, I think his point was good. If you're spending all your time on "templates and STL, learning to use and love RAII over explicit cleanup and exceptions over error codes" you're spending all your time on syntax. The goal is to get something done. If what you're getting done isn't hard enough that it takes 85% of your time, you aren't doing anything interesting. Therefore you can spend all your time debating the best use of templates.

      Of course you aren't supposed to "debate the best use of template" or "spend all your time on syntax" when coding C++! You have to learn to use them properly once, so that you can write in 2 concise and clear lines what takes 20 in C (if you want the same level of efficiency). Approaching C++ as if it were just C on steroids will not help you towards that goal.

      I love templates, the STL, RAII (I find exceptions overrated, at least as used in many libraries).

      How can you do proper RAII without exceptions? What should a constructor do if it cannot satisfy the invariant for the object being constructed for whatever reason?

      Java sucks. It's starting to suck less. The libraries suck the worst. Over complicated, under documented, and missing just as you get to the part you need. But overall, it sucks.

      I'm not exactly a Java fan, and I can certainly understand how easy it can be to grow to hate the limitations of the language itself quickly; but what exactly do you find wrong in Java libs? I wouldn't say they are more overcomplicated then, say, Boost, or even Qt.

    9. Re:Starting low level vs meet-in-the-middle by blair1q · · Score: 1

      Wait. After I return from your subroutine, am I supposed to do something with the return value? What register is the return value? What do you mean, "assembler doesn't have return values"? Then how do you return a value from a function? A function. You know: A subroutine that takes typed arguments and returns a typed return value. "What's a typed?" Really?

      And you can do anything assember that you can do in any language; does that make any language a tarted-up assembler?

    10. Re:Starting low level vs meet-in-the-middle by blair1q · · Score: 1

      C hides stacks from you. I don't know why you have to teach them to anyone. And Java and C++ don't eliminate stacks.

      In theory, you don't need to teach pointers as arrays of memory locations. You can show them as references with different behaviors and rules for correct use.

    11. Re:Starting low level vs meet-in-the-middle by tucuxi · · Score: 1

      C hides stacks from you. I don't know why you have to teach them to anyone.

      You don't have to teach it, until people start complaining that they get weird errors after overflowing a stack-allocated array. Knowing what the stack is and how it is used really helps then.

      And Java and C++ don't eliminate stacks.

      I never said that Java and C++ did not use them. But overwriting the stack with garbage is much harder under Java and other memory-managed languages. Which C++ is not, even if you can overload 'new'.

      In theory, you don't need to teach pointers as arrays of memory locations. You can show them as references with different behaviors and rules for correct use.

      You can teach pointer semantics out of thin air, but I think it makes more sense if you tell people where that comes from. If you teach C, you may as say why it was designed the way it was designed - and why that makes C programs prone to fail in interesting ways.

    12. Re:Starting low level vs meet-in-the-middle by blair1q · · Score: 1

      Stacks are a compiler and platform implementation issue. C does not require the use of a stack.

      Java's means of keeping you from writing to random locations in memory is something of a hindrance when trying to use anything memory-mapped. You will have to write code somewhere to tell the system to map symbolic objects to real locations, and you will have to do it in a language other than Java.

      C's means of failing in interesting ways and corrupting your program is roughly as big a problem as Java's means of failing by starting out far less capable and keeping you from doing many things you might think of as natural.

      It's a tradeoff. Can you use the big-boy software, or do you need to have the kind that doesn't have small parts that come off and you can choke on?

    13. Re:Starting low level vs meet-in-the-middle by tucuxi · · Score: 1

      C does not require the use of a stack.

      True (to my surprise). However, most architectures use stacks to implement argument-passing (I am not aware of any that do not), and understanding how something is expected to work is key when finding out what went wrong.

      Java's means of keeping you from writing to random locations in memory is something of a hindrance when trying to use anything memory-mapped.

      True, java would be the wrong tool for that job. Does that disqualify java for teaching algorithms or high-level program architecture?

      It's a tradeoff. Can you use the big-boy software, or do you need to have the kind that doesn't have small parts that come off and you can choke on?

      Not really. It is about using the best tool for the job, the job being teaching people how to program. I still think it is better to learn a few things a time (algorithms are complex enough without memory management issues) than to try to do everything at once, badly.

  37. Help by danwesnor · · Score: 1

    Can someone tell me on which page he stops the senseless rambling and gets to the point? I can't imagine having this guy as a professor. He loves to hear himself talk too much.

    1. Re:Help by ROBOKATZ · · Score: 1

      Page 18.

    2. Re:Help by danwesnor · · Score: 1

      Nope, still rambling. Dude used a 0-based page numbering scheme. That's about as arrogant as a CS prof can get.

    3. Re:Help by Fallingcow · · Score: 1

      I agree; this paper has a shockingly low information density for something written by a supposed scientist, (presumably) used to working with terse and precise language.

      If you plotted types of informative writing on a line, you'd have:

      1. extremely precise writing that's a bit harsh on one end
      2. more verbose, accessible, and pleasant writing that's still informative in the middle.
      3. writing that's trying too hard and just sucks, failing to be well-crafted prose and failing to inform efficiently.

      This is clearly closest to number 3. Even if there are good ideas in there, they're buried in whole pages of fluff, and I say this as a guy who reads lots of things from disciplines that many Computer Scientists probably regard as being wholly composed of fluff :)

  38. std:: vs System. by liquiddark · · Score: 1

    cout doesn't have any meaning if you don't scope-qualify it any more than 'out' does. So you have 14 vs 13 non-output characters. Not exactly game-changing.

    1. Re:std:: vs System. by liquiddark · · Score: 1

      That was perhaps not the most fully-considered of comments, what with System being an object, std a namespace.

      Let me try again: Verbosity is a much bigger argument than single statements are ever going to capture. Java is thought pretty widely to be verbose, but that is entirely perpendicular to the reasons why it might be bad for new programmers - learning either a functional language or a bare-metal language (ie anything with pointers) is a better option in order to more completely map the student's thought process to the actual operation of his or her code.

    2. Re:std:: vs System. by Raenex · · Score: 1

      what with System being an object

      It's actually a class.

    3. Re:std:: vs System. by liquiddark · · Score: 1

      Fair enough. It's been that kind of day for posting on the internets.

  39. Short-sighted and wrong by Anonymous Coward · · Score: 0

    The P=NP problem is just the sort of educational fluff that makes students think they know theory when actually they do not. The students then believe that theory does not help them write programs (although it may help then analyze existing programs). Abandoning theory, they glibly program using the one and only strategy "software engineering" affords them: guess and check. First, they guess: make a mental image of what the computer ought to be doing, and program it in. Next, they check: run the program a few times (if that) and see what happens. No wonder program errors are considered omnipresent and inevitable.

    To make matters worse, most introductory theory courses leave students with the distinct impression that program correctness is to a certain extent unknowable. While the P=NP problem is harmless (if lightweight) the halting problem and the accompanying Rice's Theorem are downright insidious. Dijkstra is right that programmers don't want to take responsibility for their own errors, and Rice's Theorem allows them to use the "unknowability" of correctness as justification for making mistakes. (The correctness proofs that are constructed in algorithms classes ironically reinforce this notion by cementing the idea that correctness is something you worry about after the fact.)

    It doesn't take a prophet to see the emerging regime of certified programs. Once that comes about, all mission-critical software will be made using formal proof techniques, since this has shown to be the only way to be 100% sure that no errors exist. Then and only then will we as programmers really be able to claim to write programs that "solve real-world problems" rather than programs that sometimes behave correctly and sometimes cause a catastrophe. You may not like it, and it may go against your ingrained intuition, but it will happen and you'd better be ready for it.

    1. Re:Short-sighted and wrong by msuarezalvarez · · Score: 1

      Your whole comment is supported on the confusion of computer science and software engineering.

    2. Re:Short-sighted and wrong by Lord+Ender · · Score: 1

      all mission-critical software will be made using formal proof techniques

      Wow. I'm going to go out on a limb and say you are a member of academia, not industry... While you are proving your code, your competitors will be releasing software and stealing marketshare from you.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    3. Re:Short-sighted and wrong by Anonymous Coward · · Score: 0

      While you are proving your code, your competitors will be releasing software and stealing marketshare from you.

      What I think you're getting at is that formally proving correctness is hard and time-consuming. I would counter that debugging is hard and time-consuming. Once the effort required to prove correctness drops below the effort required to sufficiently debug a program then it will become economically feasible.

      The key phrase is "sufficiently debug". Different applications have different reliability requirements. Military and space applications are among the least tolerant of error, so they will be the first to benefit from formal proof techniques.

      Proving correctness is really not as hard as it sounds. People don't program at random; everyone knows what they're trying to do and how they're trying to do it. That is more than half the proof work right there. Most of what remains is the formalism, which is merely a matter of training. The really tricky bits are those instances where you think you know how your program should work, but you can't seem to find the proof. These parts of the program are fertile grounds for errors, and fully warrant the extra careful scrutiny they will require.

  40. Motivation is easy by Bozdune · · Score: 1

    I'm afraid I'll have to differ.

    There is nothing more fascinating than learning how computers really work. And this background is essential when designing algorithms and memory structures that must be efficient. It is merely a question of teaching this in an interesting way, and of relating it to real-world problems, such as "why is this pretty reasonable-looking high level language code so fucking slow?"

    1. Re:Motivation is easy by msuarezalvarez · · Score: 1

      There is nothing more fascinating to you than learning how computers really work. Don't you think that there may be people with different motivations and objectives?

    2. Re:Motivation is easy by Bozdune · · Score: 2, Insightful

      Maybe they should choose a different line of work?

    3. Re:Motivation is easy by msuarezalvarez · · Score: 1

      If you think the activities covered under the title "computer science" all involve a computer and working on it, well, you do not know what computer science is. If you think that "learning how computers really work" is the only possible motivation for doing computer science, well, you are wrong.

    4. Re:Motivation is easy by Garse+Janacek · · Score: 1

      There is nothing more fascinating than learning how computers really work.

      I'm now working on a PhD in theoretical computer science, and am interested in how computers work (although that's not exactly my primary interest). But long before I knew any CS theory or systems programming or anything, what got me interested in computers was the neat things I could make them do. In high school I spent years making games and neat little graphics demos and things. As I understood more of what I was doing, I was able to work at a deeper level, modify kernels, mess with assembly, and generally learn "how computers really work".

      But if someone had started me out that way, teaching me from the transistors up how computers worked while never talking about what I can do with them right now, I would have given it up and done something more interesting. I'm glad you weren't my teacher in high school, because these days I'm quite happy with my chosen field, and you're essentially saying (in your other response below) that because I learned about it in a way I found interesting, somehow this is illegitimate and I shouldn't really be in computer science at all.

      I agree with you that it is vital that computer scientists learn how computers really work. But it isn't vital that this knowledge is forced on them before they have ever produced a running program, or before their interest has been piqued by other aspects of the field.

      --

      I am the man with no sig!

    5. Re:Motivation is easy by TerranFury · · Score: 1

      If you think the activities covered under the title "computer science" all involve a computer and working on it, well, you do not know what computer science is. If you think that "learning how computers really work" is the only possible motivation for doing computer science, well, you are wrong.

      My favorite analogy: It's like calling astronomy "Telescope Science."

    6. Re:Motivation is easy by Bozdune · · Score: 1

      I guess I was thinking about college coursework, not motivating a youngster. Your high school experience sounds similar to mine, although mine began in 1970 with a 110 baud teletype and paper tapes.

    7. Re:Motivation is easy by Garse+Janacek · · Score: 1

      Well, but that's part of the issue: not everyone has, or can have, the kind of high school experience we did. College needs to get you started with at least low-level theory early on to prepare you, but if we artificially push it to the extreme of being only math and low-level engineering, it will push people out of the major when they could have been very happy there given a more motivating introduction. I'm not advocating dumbing things down, the courses should be hard, but the students should understand why they are doing the hard work, and that requires at least some hands-on applications early on.

      I also speak from the frustration of having had to teach CS stuff in certain contexts where I could be asked "can you give examples of where we would use this stuff?" and having no good answer, because I wasn't crazy about the curriculum myself (and I say this as a theoretician)... and from observations of how much better some students "get it" when they are able to apply even simple abstract concepts to code they write that actually does something. Not everyone learns the same way, but it should be possible for someone entering the discipline to find something they can get excited about right away, even if there are other parts they don't like as much...

      --

      I am the man with no sig!

    8. Re:Motivation is easy by Bozdune · · Score: 1

      I enthusiastically support your interest in applied mathematics. You'd probably be much happier in the math department, though, rather than struggling to justify yourself as a "computer scientist" to the rest of the academic community.

      I also agree that we need to find a better name for the course of study under which we've been handing out Engineering degrees for the last 35 years.

    9. Re:Motivation is easy by msuarezalvarez · · Score: 1

      I am not a computer scientist; I am a mathematician. In any case, I do not see any need for a computer scientist to "justify himself" to no one, as anyone with enough knowledge can tell that there is a perfectly justified field of knowledge there to be studied.

      It is too bad if you've been handling Engineering degrees under the name of CS. That does not mean that CS does not exist.

    10. Re:Motivation is easy by Bozdune · · Score: 1

      I've never had to use Modern Algebra, and it was a terrible class (Ron Rivest is a nice guy, but at the time, at least, was a really awful lecturer). But I sure wish I'd paid more attention to the linear algebra course, and the probability course that seemed completely inapplicable back then has been enormously useful to me over the years.

      I'm not sure you can ever justify a core curriculum to students. It may be an impossibly high bar.

    11. Re:Motivation is easy by Bozdune · · Score: 1

      anyone with enough knowledge can tell that there is a perfectly justified field of knowledge there to be studied.

      Really? There's been a massive discussion for the last 20 years on this very topic, in CACM and other CS journals, led by faculty who have a great deal of difficulty both defining CS and justifying themselves to other academics. But I'm glad the world is so simple for you.

    12. Re:Motivation is easy by msuarezalvarez · · Score: 1

      The mathematical study of computation is quite a definite body of scientific knowledge. The formal study of programming languages, all the way from their syntax to their semantics is undeniably CS. The "computational $X" for various values of X (molecular biology, filogenetics, material science, what not) are disciplines quite distint from the corresponding $X, involving specific methods and interested in solving different problems. And so on.

      One can debate for ever in search of precise, clear cut, definitions of what CS is---after thousands of years, no one has been able to come up with a sensible definition of what mathematics is, so it is not surprising that what's essentially a 100 year old discipline is a bit harder to pin-point. But that does not mean, at all, thatthe existence of a specific type of human endeavor exists which one groups under the label "CS"

      As for justifying oneself... again, that's inevitable, and practitioners of age-old mathematical disciples like geometry and arithmetic spend countless hours doing precisely that, as it is in part required to for example get a grant!

  41. The more things change... by Plekto · · Score: 2, Insightful

    Fantastic article. I especially like this part:

    (1) The business community, having been sold to the idea that computers would make their lives easier, is mentally unprepared to accept that they only solve the easier problems at the price of creating much harder ones.

    So true. I deal with this every day. Despite the high tech wizardry around us, business still runs pretty much the same. Just, the management is all too happy to throw its problems at someone else. I can't remember how many times in the past that I've had a client, boss, or manager ask me something that is impossible and tell me "fix it" or "make it work".

    1. Re:The more things change... by blair1q · · Score: 1

      Allow me to reset the attitude:

      Computers take care of easy tasks so that people can be freed up to deal with hard ones. Some of the hard ones will be created by the use of computers, but they can be safely ignored if the computers are still doing the easy ones.

    2. Re:The more things change... by Plekto · · Score: 1

      And this is exactly the sort of addle-headed MBA management nonsense that leads to problems that we saw during the .com bust a few years ago. The "magic fix" ideology that computers will solve everything and free us. They thought this as well fifty years ago with kitchens and look at how many people still cook as bad despite all of the fancy tools at our disposal.

      "Safely ignored" is a naive' statement on your part. The larger problems are exactly the ones that will eventually doom your company to failure if you ignore them. I can't begin to name the number of companies that I've worked for or dealt with over the years that are literally stagnating or being crushed under the weight of their IT departments. They throw money at their problems instead of changing how they deal with things. A great example of this sort of idiocy is going on right now with the U.S. auto makers. Give us money - give us technology! It can all be solved! No, I'm sorry. The real problem is the idiots in charge who can't innovate their way out of a cardboard box, let alone beat Toyota and other companies.

      I'll put my money on Dijkstra this time. I suspect he's a lot smarter than most of us here.

    3. Re:The more things change... by Shotgun · · Score: 1

      In the early nineties, I worked on a moving van. One job we had was to move the Jefferson-Pilot insurance company into a new building. They had a floor of nothing but filing cabinets full of 3"x5", carbon-copy, slips. For you youngsters*, carbon-copy slips are thin paper placed under a piece of carbon paper, placed under a document. It provided a way to record a second or third copy when you signed a document. Each one of those slips represented someone's insurance policy, and many of those slips got picked up off the floor (they just fell out).

      Today, those thousands upon thousands of slips of paper can be digitized and kept on a couple of hard drives for instant access, or recorded to some more permanent media for long term storage. We're talking a couple of hard drives to keep up with, vs a floor of filing cabinets. There is the a new headache to deal with (maintaining the digital storage), but the effort to maintain a few thousand of yesterdays records will suffice to maintain billions of todays.

      Companies stagnating or collapsing under the weight of their IT? Those companies could NOT have existed 30 years ago. The IT is the only thing that allowed them to get so big. They have problems for sure, but the easy problems are solved.

      --
      Aah, change is good. -- Rafiki
      Yeah, but it ain't easy. -- Simba
    4. Re:The more things change... by maxume · · Score: 1

      The automakers are a bad example. Their problem is almost entirely the promises that they made 30 years ago and proceeded not to pay for. From an operational perspective, the feeding frenzy around SUVs was a mistake, but their vehicles are of at least similar quality to most of the other automakers, and not particularly better or worse from an 'innovation' perspective (to wit, the Pontiac Aztec is nearly as ugly as the Scion, it just happened to be saddled with the Pontiac brand).

      --
      Nerd rage is the funniest rage.
  42. Cruel?!? by supernova_hq · · Score: 1

    ...have most schools corrected course and are now being necessarily cruel to their Computer Science students?

    Buddy, we have 6 assignments, 2 quizes and an industry project presentation this due week.

    You tell me!

  43. Dijkstra couldn't use a computer?!? by mengel · · Score: 5, Insightful

    Boy do you need to go back to school. Edsger wrote more and better stuff in his lifetime than anyone here on Slashdot. Did you ever get directions from Google Maps or Mapquest? Thank Edsger -- his shortest path algorithm is what they all use, and by the way, he wrote that before you were born, most of you. You know the semaphores used in the multi-cpu Linux kernels? Yep, you owe Edsger for them, too. And programming languages like C, Pascal, etc.? He helped write the first Alogol compiler, the great-grand-daddy of them all, once again before most of you were born.

    Just because he eschewed the run-break-fix approach so beloved of the folks who are spewing billions of lines of error-laden code into the world today, doesn't mean he hadn't forgotten more about writing code than most folks here have ever learned. And yes, he advocated developing code formally, and he liked to do it with pen and paper.

    So learn about who you're making snide comments about, and show some respect. When people are still using any algorithm you came up with 30 years from now, you will have the right to say something about Edsger Dijkstra.

    --
    - "History shows again and again how nature points out the folly of men" -- Blue Oyster Cult, 'Godzilla'
    1. Re:Dijkstra couldn't use a computer?!? by Darth_Burrito · · Score: 1

      Shortest path algorithm, semaphores, compilers, programming language design...? This is the kind of stuff of formal programming methodologies. However, the kind of stuff that goes into it is not the kind of stuff that goes into software development in 99.99% of the world. Dijkstra was no doubt very smart, but I'm not sure I'd hire him to build business software.

    2. Re:Dijkstra couldn't use a computer?!? by g1zmo · · Score: 2

      Dijkstra was no doubt very smart, but I'm not sure I'd hire him to build business software.

      Just like I wouldn't hire Daniel Bernoulli to fly my corporate jet.

      --
      I have found there are just two ways to go.
      It all comes down to livin' fast or dyin' slow.
      -REK, Jr.
    3. Re:Dijkstra couldn't use a computer?!? by jmorris42 · · Score: 1

      > So learn about who you're making snide comments about, and show some respect.

      Yea he has done great things. Doesn't make him the final authority on anything. He is still another blind man trying to describe the elephant. He is a math weenie so he sees everything in those terms. The linguists see everything in their terms, thus tend to become LISP weenies when they get exposed to computers. Then you get the OO weenies trying to model everything as objects anbd beliving equally fervently that any other approach is a heresy.

      The problem is they are all both right and wrong. Each describes part of the problem space while ignoring everything else. And the whole issue is really fudged up when we consider that so much of what we now call 'software development' isn't anything of the sort. Half of it is just UI design which is more human factors and graphic design than programming. Most of the rest is getting the design specification right. The actual coding is usually more a case of grabbing existing libraries for the sort of algorithms Dijkstra is usually talking about and slathering enough buzzword compliant crap (these days it usually enough to mention middleware, Java and XML several times) on to make the PHBs happy. And of course forget the documentation because whatever happens any documentation that does accidentally happen will be useless and obsolete before 1.0 and will never get updated.

      --
      Democrat delenda est
    4. Re:Dijkstra couldn't use a computer?!? by cslax · · Score: 1

      Is it weird that I prefer coding with pen and paper? Then again, I care more about the theoretical stuff than practical coding...

    5. Re:Dijkstra couldn't use a computer?!? by jonaskoelker · · Score: 1

      When people are still using any algorithm you came up with 30 years from now, you will have the right to say something about Edsger Dijkstra.

      Nah, I don't buy that. We have the right to criticize him and his ideas all we want, no matter our and his past accomplishments.

      The only important requirement is that we critique his ideas based on their own merit.

      Just because he eschewed the run-break-fix approach so beloved of the folks who are spewing billions of lines of error-laden code into the world today

      I'd rather have billions of LOCs that let me read slashdot than thousands of lines of code that provably correctly lets me alternate between printing A's and B's.

      Proving your code correct is notoriously hard. I'm doing TA work in "Contract-based Programming" right now. Project one was an implementation and correctness proof of divmod and merge. Only one group of students (out of ~eight) handed in something that I would consider good enough to bet money on. Project two was insertion sort. Half the proofs were shoddy, the proof rules were incorrectly applied, the loop invariants were too weak and contained unnecessary conditions at the same time. Even the one group I'd bet money on had some minor errors that would need correction. The reports run to about ten pages on average, for ten lines of code.

      If you want to prove firefox-running-on-linux correct, you need prove the correctness of firefox, linux-gate, libpthread, libdl, libstdc++, libm, libgcc, libc and linux in combination (list courtesy of ldd, but I think there should be a lot more...). If you want to have support for images, javascript, java, flash, output to X11 and some GNOME-ish look and feel, you need to add libimagesomething, libx11, javavm, flashvm and libgtk to the list. And of course libgtk requires libgdk, and ...

      No, let's rather just run code that does something of value than prove our code to correctly do nothing of value.

      Let's not forget that science is not only a philosophical construct, but also a social and economic one: the public pays tax money for science because they expect something useful out of it.

      If you ask me, that means you have to bet against Dijkstra.

      By the way, do you have a correctness proof for that Algol compiler? I'd like to read it...

  44. Alan Turing by Kupfernigk · · Score: 1

    Babbage's Difference Engine was a calculator, not a computer. However, I do take slight issue. Anyone who has read about what Turing made the Manchester Mark 1 actually DO, apart from being suitably awed, would have to admit that while notionally it belonged to Manchester U, Turing definitely pwned it.

    --
    From scarped cliff or quarried stone she cries "A thousand types are gone, I care for nothing, no not one."
    1. Re:Alan Turing by borgheron · · Score: 1

      The Difference Engine was a calculator, but the Analytical Engine was actually a full on computer. It had a rudimentary instruction set, registers, comparison operations and branching operations.

      It's truly scary to think about where we might be today had the British government at the time had the foresight to continue to fund him.

      GC

      --
      Gregory Casamento
      ## Chief Maintainer for GNUstep
    2. Re:Alan Turing by Anonymous Coward · · Score: 3, Insightful

      If Britain had not dismantled the machines they made during the war, and didn't force Turing to take hormonal treatment (thereby indirectly killing him) for being homosexual, they would most likely still be a super power to this day.

  45. what's left of Edsgar cruelty by Device666 · · Score: 4, Insightful

    "I mean, if 10 years from now, when you are doing something quick and dirty, you suddenly visualize that I am looking over your shoulders and say to yourself 'Dijkstra would not have liked this', well, that would be enough immortality for me." - Edsger Wybe Dijkstra

    A lot of software engineers like to work with new technologies, new paradigms, new code design patterns, new software development technologies and other forms of complexity. Quality Assurance rules by checklists and testing, only fixing symptoms. Every coder has it's own ideology what is correct code or the correct way to do it. Correctness proven by superficial subjective quality standards, beautiful crafted hacks included.

    Edsger found ways to mathematically prove programs to be correct, requiring a very high level of math skills (the same level which is needed to prove the correctless a mathematical theory). This utopistic objective quality standard. Stuff for the real hard core developers who have plenty of time.

    But most haven't the time. In the end time-to-market is key. Swift hackers remain the heroes of business who craft applications which get used in the real world.

    However some pragmatical things I thank Edsger Wybe Dykstra for: invention of the stack, his low opinion about the GOTO statement; shortest path-algorithm, also known as Dijkstra's algorithm; Reverse Polish Notation and related Shunting yard algorithm; Banker's algorithm; the concept of operating system rings; and the semaphore construct for coordinating multiple processors and programs. His charismatic remarks about what we would typically consider software engineering are entertaining and humbling, examples:

    • "The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence."
    • "APL is a mistake, carried through to perfection. It is the language of the future for the programming techniques of the past: it creates a new generation of coding bums."
    • "The question of whether Machines Can Think... is about as relevant as the question of whether Submarines Can Swim"
    • "The competent programmer is fully aware of the limited size of his own skull. He therefore approaches his task with full humility, and avoids clever tricks like the plague"
    • "Write a paper promising salvation, make it a 'structured' something or a 'virtual' something, or 'abstract', 'distributed' or 'higher-order' or 'applicative' and you can almost be certain of having started a new cult."
    • "The required techniques of effective reasoning are pretty formal, but as long as programming is done by people that don't master them, the software crisis will remain with us and will be considered an incurable disease. And you know what incurable diseases do: they invite the quacks and charlatans in, who in this case take the form of Software Engineering gurus. "
    • FORTRAN, 'the infantile disorder', by now nearly 20 years old, is hopelessly inadequate for whatever computer application you have in mind today: it is now too clumsy, too risky, and too expensive to use.
    • "In the good old days physicists repeated each other's experiments, just to be sure. Today they stick to FORTRAN, so that they can share each other's programs, bugs included."
    • "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."
    • "Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians."
    • "We can found no scientific discipline, nor a hearty profession, on the technical mistakes of the Department of Defense and, mainly, one computer manufacturer."
  46. False dichotomy by Tony · · Score: 4, Insightful

    Most of y'all are presenting a false dichotomy. It's not "Either learn abstract formalism OR learn practical languages." You can do both, you know.

    I have met too many people who think that, because they can write some tangled, fucked-up C++, they are software engineers. Never mind the fact that they couldn't learn LISP, Objective-C, Java, or any number of other useful languages, as they don't know the first thing about actual computing.

    Teaching Java or C++ doesn't matter. Sure, you need classes on practical application of your knowledge. But if you ignore what Dijkstra says here, you're going to end up with a bunch of code monkeys who have to test every element of the set, rather than test the rules of the set.

    In my experience, those who started off learning theory, then learned how to apply that theory in practical situations, are far better programmers than those who are taught "practical" languages.

    There's some very good advice in that paper. Calling him "out of touch" is a bit shortsighted.

    --
    Microsoft is to software what Budweiser is to beer.
    1. Re:False dichotomy by Anonymous Coward · · Score: 0

      The problem is that only the code-monkey will make it past HR because he has all the bullet points for the requisite languages, libraries, and frameworks; while the theorist is left pleading "but I can just learn all that!" And thus the code moneky gets hired and goes on to earn more bullet points and HR darwinism ensures the theorists die off.

    2. Re:False dichotomy by Tragek · · Score: 0, Redundant

      It's a dichotomy if you conflate the practice of creating programs for a user with creating programs to solve problems.

      The kind of programming Dijkstra is talking about is solving mathematical problems like finding the shortest path, etc. Not programming in the sense of providing a neat visualization of the path a packet takes between routers.

      There is some overlap, yes, but I think that the distinction between CS (what Dijkstra is talking about) and Software Engineering is that CS is about creating the algorithm to find a result. Implementation is detail after the algorithm is created, and is independent of language, and so it makes sense to teach a provable non-language rather than a language like C,Java,Perl,C++,Smalltalk etc.

      The reason people don't like what he says however is mostly because of the lack of differentiation between software engineering and CS in most schools. They think of a degree as a practical piece of paper for a job, not as being taught an entirely different way of thinking. In this case CS degrees are teaching things that are really beyond its ken.

    3. Re:False dichotomy by jonaskoelker · · Score: 1

      In my experience, those who started off learning theory, then learned how to apply that theory in practical situations, are far better programmers than those who are taught "practical" languages.

      Amen!

      More important that learning how to implement Fibonacci heaps or IO-efficient merge sorts, my advanced algorithms course taught me by having me go through the motions that theoretically fast sometimes is and sometimes isn't practically fast, and that I always need to measure.

      The practical application? Synergy2 has a function that is given some axis-parallel rectangles in the plane and tries to find an intersection between any two. The code says "for ... for ... // XXX O(n^2)". I've implemented an O(n log n) line-sweeping algorithm, but not even for insanely big n and insanely small rectangles could I make the line-sweeping algorithm go faster. The rectangles correspond to your screens, so n < 1000 seems like a good assumption.

      Synergy will probably get the following diff s/XXX O(n^2)/This is O(n^2). You can't do it faster. There an O(n log n) algorithm which is slower even for big n. Please try, though ;)/ instead of a diff that

      • slows it down
      • increases the amount of code; and
      • decreases the obvious correctness of the algorithm

      Being gone through the motions: good thing.

      If you're curious about the line-sweeping, here it is:

      • segs = sorted(line segments, by y top-to-bottom)
      • active = {}
      • for each line segment SEG in segs:
        • if SEG is at the bottom of a rectangle: active.remove(SEG.[x_s..x_e])
        • else if active contains an interval overlapping with SEG.[x_s..x_e]: return "overlap"
        • else: active.add(SEG.[x_s..x_e])
      • return "no overlap"
  47. At Northeastern, yes by l33td00d42 · · Score: 1

    Second semester freshman course is mostly about constructing machine-checkable proofs about programs. http://www.ccs.neu.edu/course/csu290/syllabus.html

  48. In Car Terms by Liath · · Score: 1

    He's saying that computers represent combustion driven vehicles, as compared to sweat and bones driven vehicles, and that even though the wheels and the body may look similar, the purpose the same, we cannot faithfully still call a car a carriage.

    This was a great way to start my day. So seldom do I thank you, slashdot...

  49. People who cannot do math - cannot write good code by Anonymous Coward · · Score: 0

    I think that some schools produce people who cannot write code -- especially this day and age -- is that those people really cannot conceptualize and abstract well enough to write code.

    Dijikstra's point, and I agree with, that Computer Engineering has deteriorated in to a methodology of teaching people who cannot program - how to program.

    Yes, it is true, that not everebody who can do well in mathematics can be a good programmer. That has to do with their personality and probably lack of motivation to understand and
    conceptualize problems that were created by humans and not natural systems (like CRMs).

    However, the chances that a person who does not have brain for math -- can be a good programmer, I think are nil (or null). Regardless of how much
    education they get.

    The untold truth is -- that because pay is good (compared to many other fields) -- there is a huge number of people who enter the field of computer science that should not be there.
    The ones who graduated, entered the workforce
    and figured out that they cannot really do it -- become either Managers or QA specialists. Both are horrible outcomes for the industry.

    If you look at this -- we have driven our customers to expect patches, updated, bug fixes etc as a 'natural course' of operation. I personally do not think this should be acceptable.

    If the requirements would be to create functional software (and not support the functions that do not work or work partially) -- then the type of people who would be required to produce such software would be very different than 80% of the todays programmers (no matter what country they are from by the way... I have done 4 month of interviews in Moscow, Russia of candidates
    from prestigious universities -- and some did not know that an array had to be sorted before doing binary search -- but they knew Actors and Action in OO design and why XML is so great...).

  50. Big Deal by interval1066 · · Score: 1

    Ok, I get that Dijkstra was a profound mathematician type. But honestly, with regard to computer science, he just comes off as a fuddy-duddy luddite. I know a few scholars who refuse to use word processing applications to write their papers (one tenured researcher at my work, a phd mathematician well past his prime will only use his old IBM Selectric), regardless of how well they know their productivity could be increased. And I don't want to hear any aesthetic arguments. If I were an employer today I might find such behavior 'quaint', but of no use on my payroll. None. In my opinion he just comes off as an intelligent quack.

    --
    Python: 'And then suddenly you have a language which says "we're all stuck with whatever the whiniest coder wants".'
    1. Re:Big Deal by meson2439 · · Score: 1

      Hey, he use LaTeX which is standard for publishing papers and is actually simpler for both researcher and publisher. Writing mathematical equations and doing proof is also simpler. Word processors compared with LaTex is like comparing data analysis using excel with C. Excel is more intuitive but is simply too clumsy compared with C especially with large data.

  51. Analogies are like cars.... by slackmaster2000 · · Score: 1

    I must say that I agree very much with many of the points he's made in this paper. Anthropomorphizing concepts and excessive use of analogy is bad for teaching programming and it's bad for teaching many other concepts.

    In terms of programming, one thing I absolutely hate are "real life analogies." Take the "Head First" series of books. On one hand they're very good at diving into subjects and explaining the concepts in several different ways. On the other hand, all of their examples are so far removed from reality that they're meaningless outside of the context of high level discussion. "Bill and Ted want to order a pizza, but Bill wants a Chicago style pizza and Ted wants a New York style pizza. What they need is a Pizza Factory!" Huh? I mean, I get it, but completely outrageous analogies don't really help when you get into the process of actually writing code. If outrageous analogies did work, then naming would be a breeze....writing comments would be fun!

    Another example of poor example is the familiar "let me teach you about Object Oriented Programming by considering a circle, a rectangle, and a square." Of course these three things are all "shapes", and invariably they all "draw()" themselves. You can replace this example with the tried and untrue animal (or dinosaur) example in which an array of animals or dinosaurs are all related and differentiated and all, of course, "bite()" or "move()". These examples are horrible because they ask more questions than they answer. That is, the concepts behind OOP are not so complex that they require high level analogy to explain -- as if the people who will be writing OOP programs are non-programmers. And when the brain starts to consider how these analogies apply to real-life situations, it wonders things like, "wait a minute, why would a circle draw itself? What does that even mean? On my screen? In a window? On some paper in my printer? Or does it just return some data structure containing points? What is the value of that?" and "ok, my dinosaur just "bit()", but what did it bite on? How can my cheetah "move()" without knowing about its environment?"

    In the end, the concept is understood but the actual implementation -- how these concepts can actually help us in the completely abstract unreality of a computer program -- is missing. What's most disturbing is when a text book will start with one of these corny high-level examples and then actually IMPLEMENT the example verbatim. That is, they'll have crazy polymorphic tyranosauruses and cheetahs and ducks all biting on shit in a completely meaningless exercise that wouldn't even apply to video game design.

    In the non-computing world, poor use of analogy and anthropomorphizing concepts has an even greater impact on our reality. Consider the following statements: "buffalo travel in herds because there is safety in numbers." "Lions have eyes in the front of their heads to focus on their prey, and zebras have eyes on the sides of their heads so that they can watch out for lions."

    Both of these statements would be considered basically true, however they are completely false. Buffalo travel in herds because that's what they do. Lions and zebras have eyes where they have eyes because that's where their eyes are. They had no choice in the matter. Their evolution was not one of decision making, but of beneficial mutations and lots and lots of death over thousands of generations. Explaining this as though some sort of strategy were involved only complicates matters and makes it more difficult to grasp the scope of time required or appreciate the concept of genetic mutation as something that has nothing to do with the Incredible Hulk.

    I don't think I have to explain why injecting decision making into evolution is a dumb and dangerous thing to do, and does not help to further our knowledge of the subject but in fact just the opposite. Ok, I will explain it: intelligent design.

    1. Re:Analogies are like cars.... by rcastro0 · · Score: 1

      Excellent points. I think that there is still a great amount of improvement to be made on how we teach. In the beginning, it was all dry and hard, indeciphrable. Today it is all soft and dumb, imprecise. There's serious need for artful rewriting of the approach, so that it can be comprehensive, understandable, exact, insightful. Not a small task!

      You comment reminds me of Richard Feynman, and his remarks about education. See the excerpt from his book "Surely You're Joking, Mr. Feynman".

      --
      Quem a paca cara compra, paca cara pagará.
    2. Re:Analogies are like cars.... by Fallingcow · · Score: 1

      Oh, god, analogies in the teaching of OOP are a terrible idea.

      The concept is FUCKING SIMPLE. Those ridiculous analogies forced me to go through a half-dozen books and even more online tutorials, wondering the whole time at how truly stupid I must be not to understand it after so much reading, before finally finding something that explained it in language that was aimed at a beginner but still to the damn point.

      My reaction: holy crap, that's it? That's the simple, simple thing that these other books have turned in to some sort of monster that must be approached very cautiously and indirectly, lest it see you and pounce?

      It's basically a function with the ability to inherit the attributes of another function, and persistence like an array or scalar variable.

      Jesus, is that so hard? Throw in some examples demonstrating exactly how an object differs from a simple function or routine, and you've got something that's more helpful than a pile of beginner's C++ and Java books.

      The implications are complex. The basic definition of an object is dead simple to anyone who already understands what a function is.

  52. At Ohio State, they teach this: "Resolve" by Theovon · · Score: 2, Interesting

    Towards the end of the essay, an introductory course is described where the student, as programmer, is required to build a formal mathematical definition of his program and prove that his program conforms to the definition.

    At The Ohio State University, we teach precisely this in the form of the "Resolve" programming language. For every function and every block of code, one must provide both the procedural code and a set of logical constraints that describe the effects of the process. For instance, if a function's job is to reverse the order of items in a list, then the internals of the function are accompanied by a logical constraint that tracks the movement of items from one list to another and ensures that the operation is totally consistent at every step, in terms, for instance, that the two lists sum to a constant size that is the same size as the input, and that the concatenation of the lists in a particular way yields the original list. (I'm summarizing.)

    An active area of research here is on automatic provers that take your code and your logical definitions and actually prove whether your code and defintions match or not.

  53. Mathematics by ProteusQ · · Score: 2, Interesting

    I haven't read this essay before, and have only had time to skim part of it now, but Dijkstra's criticism of mathematicians has merit, IMHO. [I have an MS in Math, so I don't claim to be an expert.] It's been over 40 years since the introduction of nonstandard analysis (including hyperreals and later surreal numbers), but it's still not a mainstream topic. In fact, it boggles my mind why a professor or department would choose to teach their students "hard" analysis (Bartle or Royden) instead of "soft" analysis (Rudin) -- "soft" analysis uses topological results to arrive at key theorems faster, while "hard" uses Real Analysis as if it were the only option on the market. Not that there's anything wrong with using Rudin and Royden in tandem, but to ignore topological results altogether smacks of willful ignorance. To paraphrase Stephen King: do you expect brownie points for being ignorant of your own discipline?

    The light on the horizon is the development of proof via programming, as covered by /. I'm sure there will be 50+ years of mathematicians screaming and kicking to avoid its introduction into the mainstream, but that will change the first time a computed proof that could not have been developed in one lifetime via the usual methods earns someone an Abel Prize. Until then, I suspect Dijkstra's point will still stand.

    1. Re:Mathematics by Arslan+ibn+Da'ud · · Score: 1

      Wasn't the fact that the four-color
      theorem was 'solved' in 1979 using a computer actual evidence of
      proof by programming? Plus the fact that no one has solved it w/o a
      computer?

      --

      Practice Kind Randomness and Beautiful Acts of Nonsense.

    2. Re:Mathematics by frank_adrian314159 · · Score: 1

      A-effing-men. The use of non-standard analysis makes a lot of proofs much easier and it's just as rigorous as other approaches. And, having read Rudin's texts, I agree with your assessment of his methods, as well. I, too, am not an expert - just an avid amateur - but I think that the way that analysis is taught has more to do with inertia and sadism than with efficiency of learning.

      --
      That is all.
  54. Amazing by eimsand · · Score: 1

    I find it absolutely amazing how the field of software engineering is filled with countless "code monkeys," and yet, none of those people ever participate here on Slashdot.

    This was not meant as a shot at the above poster. Just an observation :)

    1. Re:Amazing by Mandrel · · Score: 1

      It's just like 95% of people claim to be above-average drivers. Tell a group that you're a below-average driver, and watch the conversation die as everybody makes a mental note to never to get in a car with you.

      There's no kudos in parading your deficiencies, but there is in claiming to be part of the elite.

    2. Re:Amazing by Agronomist+Cowherd · · Score: 1

      Code monkeys can't spell slashdot. The lack of punctuation throws them.

      --
      -DwS
    3. Re:Amazing by AVee · · Score: 1

      It's equally amazing how much programmers are out there without any interest in any sort of theory, architecture or even basic technology. I have quiet a few programming colleges who indeed wouldn't read slashdot and a few more who wouldn't have a clue who this Dijkstra guy is anyway. And they don't care either.

      To a lot of people programming is just a kind of puzzle, typing stuff hoping it will work. When it doesn't work you just try random other things until it does appear to work. A lot of people seem to like the unexpected results and random bugs far more then the clean elegant solution.

      Just check stuff like Hibernate, bad code, no design whatsoever and loads of bugs. But it has lots of fans anyways.

  55. School Recommendations by pavon · · Score: 1

    Do you (or anyone else) have recommendations for schools that do a good job at teaching software engineering? I work with HS students from time-to-time and it would be nice to have some place to recommend.

    I went to a science/engineering school and got a good Computer Science education there. I agree that it would have been nice to have a couple more classes on software architecture, testing and planning, and that some of the CS classes like Automata (which I enjoyed) aren't useful for 99% of the students.

    However, the problem I've found is that all the good schools teach computer science and the ones that claim to teach software engineering are usually no better trade schools that crank out people who know a few technologies but none of the principles behind them. I wouldn't give up a rigorous hands-on treatment of Data Structures, Algorithms, and Systems Architecture for the world, so I still end up recommending a good CS program over software engineering, even if it means suffering through a few unnecessary classes.

  56. Re:engineering (mod parent up) by Anonymous Coward · · Score: 0

    Mod parent up. The analogy of [physicist : engineeer :: computer scientist : software engineer ] captures exactly the distinction between theorist and practitioner that is conflated in our industry.

  57. Ws he posting on /. by Xerolooper · · Score: 1

    He could of summed up his paper by yelling Troll, Groupthink, and then Personally I welcome our Automatic Computer overlords.

    You can tell he never owned a computer by the way he doesn't think programs need maintenance. He is confusing cause and effect. The environment the program "lives" in changes and "wears" it out therefore it needs maintenance.

    --
    "The stupid neither forgive nor forget; the naive forgive and forget; the wise forgive but do not forget." -Thomas Szasz
    1. Re:Ws he posting on /. by TheSunborn · · Score: 1

      Programs don't need maintenance, because maintenance is the process of keeping things working they way they are currently working.

      What programs do is to change/evolve the functions they implement, to solve new problems.
      If I have amath proof, and then do a extension of the proof to solve a more general case of the problem, that would newer be called maintenanc.

    2. Re:Ws he posting on /. by Xerolooper · · Score: 1

      Point taken. But to most people I think it sounds like we are arguing semantics. Like many brilliant people his thinking is purely logical and many people often are not they are irrational. I think he is right. But being right isn't always practical. It is one of the hardest things for intelligent people to learn to suffer fools gladly.
      Hollingworth notes: A lesson which many gifted persons never learn as long as they live is that human beings in general are inherently very different from themselves in thought, in action, in general intention, and in interests. Many a reformer has died at the hands of a mob which he was trying to improve in the belief that other human beings can and should enjoy what he enjoys. This is one of the most painful and difficult lessons that each gifted child must learn, if personal development is to proceed successfully. It is more necessary that this be learned than that any school subject be mastered. Failure to learn how to tolerate in a reasonable fashion the foolishness of others leads to bitterness, disillusionment, and misanthropy [3, p. 259].

      --
      "The stupid neither forgive nor forget; the naive forgive and forget; the wise forgive but do not forget." -Thomas Szasz
  58. echo 'printf("hello world\n")' | perl by msgmonkey · · Score: 1

    It's not perl if its not nearly completely unreadble :D

  59. The clueless are out in force today. by rocker_wannabe · · Score: 2, Insightful

    It is really scary how few people really understood what Dijkstra was saying. My best guess is that because most people learn programming backwards, IMHO, by starting with the languages and then learning higher-level logical constructs, like state machines or even lists or maps, it has permanently skewed their perspective.

    My experience, after over 10 years as a system test engineer on software systems, is that poor software really is from a lack of discipline in starting with mathematical constructs before writing the code. I generally worked with very experienced programmers who didn't make a lot of language errors, like improper use of pointers, but were still tripped up by things like when to free allocated memory. The kind of errors that wouldn't occur very often if the discipline of using a mathematical construct like a hierarchical state machine was enforced. For instance, instead of starting with a proven state machine library they would just set flags and create an adhoc state machine that was riddled with problems.

    --
    "Meaningless!, Meaningless!" says the Teacher. "Utterly meaningless!"
  60. You have to love some teachers... by FatherOfONe · · Score: 1

    It is funny to me how many profs talk like this guy wrote.

    Today we are going to...

    Later we will go over...

    It actually makes you think this will be some type of discussion and not a dictation. I would have loved to respond and say

    We think you are an idiot.

    As for his work? Who really knows. Maybe WE can figure it out someday.

    --
    The more I learn about science, the more my faith in God increases.
  61. I have a lot of respect for him, but... by EWAdams · · Score: 4, Insightful

    ... in this article he's insisting that a carpenter has to be a physicist before he should be allowed to build a house. (Yes, that's arguing from analogy -- deal with it.)

    The fact is that the world needs a hell of a lot of running code in a hurry. Millions of lines of it. We don't have the luxury of treating a realtime airline-pricing-optimization manager as a lovely formal system that we can write out in pencil. We have to get it up and running, then fix bugs and add features as time permits, because of a phenomenon that Dijkstra doesn't take into account: IT'S NEEDED *NOW*.

    I also think he's being unfair by suggesting that modern educational institutions are anything like as hidebound as medieval ones. First, medieval universities were not intended for inquiry in the first place; they were intended to prepare young men for the priesthood -- i.e. to teach them doctrine, which was not subject to inquiry. No institution except maybe a seminary is as restrictive as that these days. Second, it doesn't seem to have occurred to him that learning by analogy is how people learn *effectively.* He may decry teaching children about arithmetic by using apples because it's not a formal system, but a five-year-old doesn't have enough knowledge to know what a formal system IS. Starting a five-year-old with Principia Mathematica is just pointless. And your basic coding grunt who wants to build websites doesn't need to be taught JavaScript as a formal system either.

    --
    I piss off bigots.
    1. Re:I have a lot of respect for him, but... by Fallingcow · · Score: 1

      Haha, that part about how bad it is that we teach kids very young children math by analogy was great. Dude obviously never worked with small children, but felt like an authority on which kinds of teaching methods for them work and which are harmful.

      Good luck trying to teach a 9-year-old slightly more abstract math if he never did the whole "2 apples plus 3 apples thing", because, odds are, he's still stuck on how addition works, and yes, you'll have to resort to those kinds of analogies to have any hope of getting him up to the level where he can understand zero, negative numbers, variables, functions, etc. Yes, you want to get away from concrete examples as quickly as possible, but you have to start with them.

      It's a bit distressing that he felt comfortable using something he clearly knew nothing about as a fairly major bullet point in one of his arguments. I must say, speaking as someone who hasn't read first-hand anything by this guy before, this paper is unimpressive on many levels.

    2. Re:I have a lot of respect for him, but... by SgrA* · · Score: 1

      The fact is that the world needs a hell of a lot of running code in a hurry. Millions of lines of it. We don't have the luxury of treating a realtime airline-pricing-optimization manager as a lovely formal system that we can write out in pencil. We have to get it up and running, then fix bugs and add features as time permits, because of a phenomenon that Dijkstra doesn't take into account: IT'S NEEDED *NOW*.

      And you all were wondering, perhaps, what was wrong with the world today?

  62. CS by Bengie · · Score: 2, Informative

    Bad teachers gets you

    #1. cargo cult programming
    #2. people bound to a language instead of logic
    #3. not knowing why using an unsigned int in a for loop is faster than a signed
    #4. using linked lists when an array would do just fine(CPU prefetch unit can't prefetch well with linked lists)
    #5a. Unable to make multithreaded programs that always work(omg! my program works on my single/hyper-threaded cpu..)
    #5b. programmers that don't know why hyper-threaded cpus won't truely show all SMP bugs
    #6. SQL queries that take 10 minutes instead of 10 miliseconds

    It's not just about making something work, but knowing why it worked and what way works best

  63. The Truth by huckamania · · Score: 2, Interesting

    Dijkstra's Cruelty is the nickname UT cs students gave to the course his wife taught. It was a required course when I was there and it was 2 semesters long. I think it was called "Software Development" but should have been called "Fantasyland Development". Total waste of time and energy. I never saw him on campus, except maybe at graduation.

    The best classes were given by people who either were working in the real world or had some experience in the real world and were trying to get their masters or doctorate. The 'professors' going for or having tenure were the worst.

    1. Re:The Truth by colmore · · Score: 4, Insightful

      I think this is a clear case of computer science and software engineering (without going into Dijkstra's assessment of that term) being different beasts.

      Both the theoretical and immediately practical implementation of software are interesting and important, but they're studied in different ways by different people and trying to mash the two together tends to create more conflict than interdisciplinary synergy.

      --
      In Capitalist America, bank robs you!
    2. Re:The Truth by khallow · · Score: 1

      Both the theoretical and immediately practical implementation of software are interesting and important, but they're studied in different ways by different people and trying to mash the two together tends to create more conflict than interdisciplinary synergy.

      So how do they differ? Looks like different parts of the elephant to me.

    3. Re:The Truth by TapeCutter · · Score: 1

      "So how do they differ?"

      The same way pure and applied maths differ - one feeds the Elephant, the other rides on it. You don't need to ride the Elephant to feed it but it helps.

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
    4. Re:The Truth by khallow · · Score: 1

      but it helps.

      That's the point I was angling for. Mashing practical and abstract knowledge together is in my view the best of both worlds. Even the great grandparent's mention of "interdisciplinary synergy" betrays a stilted point of view. Abstract and practical thought is not that different. They should not be seperate disciplines.

  64. Nothing but wimps today... by Anonymous Coward · · Score: 0

    Back in the day, we learned Fortran, assembly and Algol all in one semester. No spell checker on the cardpunch machine either!

    (Actually, it worked pretty well as a foundation course.)

    1. Re:Nothing but wimps today... by shutdown+-p+now · · Score: 1

      Well, Algol-60 was Pascal on steroids (and a beautiful language on the whole), and I guess FORTRAN could sort of count as C.

  65. Multiple Personalities by Dareth · · Score: 1

    The part about needing multiple personalities reminded me of doublethink from 1984.

    oh, car analogy, maybe he is a genius, or maybe he just likes to blow his own horn.

    --

    I only look human.
    My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
  66. Time has given us culture. by SanityInAnarchy · · Score: 2, Interesting

    Last I checked, no one had quite figured out how to teach computer science -- your first course in college would serve mainly to flunk those who didn't know, or couldn't learn very quickly on their own, because the course itself certainly isn't going to teach you much.

    However, the specific things Djikstra is talking about are not problems.

    Consider his insistence that "bugs" should be instead called "errors", because this is less metaphorical and closer to the truth -- placing the blame where it belongs (the programmer), and allowing a lower tolerance -- a program cannot be "mostly correct"; it is either correct (with no errors) or it is incorrect (has errors).

    This is to ignore one of the most important things to understand about modern computer science: Culture, or, more importantly, communication.

    "Error", even in context in computer science, could mean several things. It could be programmer error, it could be an error in the rest of the software, it could be a hardware error, or an error status returned from any of these, even user error.

    "Bug" has a very specfic meaning. When you say you've "squashed a bug", there is very little doubt as to what you mean.

    Yes, it was initially attached to a metaphor. But as Djikstra so clearly points out, computer science is a radical novelty -- and such radical novelties tend to borrow words from older vocabulary, from other languages, from fiction, and invent some of their own. They do this not because of intellectual laziness, but because they need a vocabulary of their own -- yes, jargon serves a purpose.

    And yet, it is not such a radical novelty that old ideas will have no effect. Certainly, some understanding of mathematics will be beneficial -- and although calculus may not be needed most of the time, the way in which it forces you to think will exercise the same parts of your brain that tough programming will.

    I would argue, though, that computer science is not only informed by mathematics. It is also informed by softer sciences -- philosophy, creative writing, and languages.

    Certainly, parts of it are very much a hard science -- the best sorting algorithm for a given situation, for instance -- but these are often confined to small, easily replaced cases. After all, it should not be difficult to swap sorting algorithms in most programs.

    Other parts are very much a creative work -- an attempt to find the clearest possible way to express an idea, both to the computer, and to the next programmer. It is here that we most often talk about elegance.

    Both are necessary -- without the creative structuring of a program, and proper communication of that structure to all involved, we would not be able to swap sorting algorithms at will. Without a clear understanding of how the performance of a program is impacted by various choices, that beautiful, creative code may never run.

    And that is why it is so challenging to teach. A good programmer is going to be using both halves of his (or her) brain, if not at the same time, then certainly throughout developing a given program.

    And that is also why it's not going to be easy to learn.

    If Djikstra were alive, he could learn a thing or two from Why The Lucky Stiff.

    --
    Don't thank God, thank a doctor!
    1. Re:Time has given us culture. by splutty · · Score: 1

      Nice piece of work there :) However I need to disagree on one thing:

      "Bug" has a very specfic meaning. When you say you've "squashed a bug", there is very little doubt as to what you mean.

      Yes, it was initially attached to a metaphor.

      For some reason a lot of people seem to think it is a metaphore, when it really isn't. The term bug comes from early age computing (late 40's, begin 50's) when a lot of the actual components in a machine were relays. (Those clicky things).

      When things broke down it was quite often because there was an actual bug squished between two poles of a relay, thus making it fail to make contact (meh, that was a horrible sentence, but you get the point)

      In this case 'getting the bug out of the computer' was quite literally removing the dead beetle from a disfunctional relay. (And depending on how much current there was running through these things, sometime a rather scorched dead beetle :)

      The same thing could happen when a bug accidentilly made a connection between 2 poles that shouldn't be making that connection (Yes, bugs can be conducting in certain scenarios).

      So 'bug' was actually the physical beetle :)

      ps. For some reason my blockquote screws up...

      --
      Coz eternity my friend, is a long *ing time.
  67. Pot calling Kettle Black by ebuck · · Score: 1

    You didn't provide proof to back up your examples, so you ask us to accept that explaining
    cout << "output" << endl;
    is incredibly easier to explain than
    System.out.println("output");

    In truth, the explanations for both are very similar, with the first you indicate that the << operator puts something into the left hand side which happens to be the output to the screen.

    In the Java version you indicate that the System has an output device called out and you ask that out device to print on a line the string "output".

    Why the Java version is superior is because in the C++ version you immediately run into a major issue: How does the string get a endl put into it? To explain that you then need to explain that << is an operator which is implemented on the cout device, which then returns another invisible reference to the cout device that will also accept the endl when the << operator is called on that.

    Certainly neither is above the ability for an undergraduate to grasp, but saying that the Java version is harder to explain just shows a bias for all things familiar. I too miss the << syntax from C++ when programming in Java, but it's insane to say that the cleaner syntax results in more easily explainable programs.

    As far as garbage collection, that's easier to explain in Java too. Since Java implements only one means of garbage collection, its explanation only takes a couple of hours. C++ has two means of objects consuming memory, one that is rigid enough to explain in an hour and another that is a "figure it out for yourself" solution. Best practices must then immediately be taught, which reduces the number of ways malloc / free can be used "safely".

    I've see precious few programs which were competitive on the grounds of their improved garbage collection / freeing mechanism alone.

    Perhaps you should read that Dykstra paper carefully, as you seem to have fallen into a trap or two he describes. That said, I wholeheartedly agree with you that the current educational process has a lot be desired for Computer Science, but sometimes I wonder at the utility of a College that does not offer some job training in this age.

    Employers look to college graduates expecting them to be trained and have created a huge demand for graduates as a result. Due to the "everything for nothing" culture in the USA, those same employers make it clear that they want pre-trained employees. Colleges react in kind by expanding their enrolment and providing skills that make them competitive in the eyes of their prospective students for the purpose of obtaining a desirable job. Thus the system becomes more a job training centre each day, which is inconsistent with the loftier goals of a College.

    Lofty goals are called lofty goals because they are hard to achieve. Colleges of lesser moral fibre will play lip service to such goals and mostly do what industry wants. Colleges of stronger moral fibre will uphold such goals and risk losing credibility with the future hiring base and likewise their future student body. Only a few truly exceptional Colleges will ever be able to disregard the collective employer pressure; like the Computer Science program Dykstra was enjoying. For the masses, environment shapes the subject to a greater degree than we might like.

  68. I can relate... by gillbates · · Score: 4, Insightful

    But I think his arguments are centered around a misunderstanding of terms. It's simple academic dishonesty to which he objects:

    • Computer Science is a discipline of mathematics, a true science.
    • Computer Engineering is an engineering discipline, concerned with how to use the principles of computer science to create working systems. Provable correctness is a must; you don't get to respin a board until it works. Generally speaking, things have to work right the first time.
    • Software Engineering is a vocational discipline, which requires some knowledge of computer science, in the same way a construction foreman needs to know basic math. Software engineering requires both an understanding of programming and the corporate structure for producing software. But it is more a collection of specific pragmatic methods than an exact science.
    • Computer Programming is a vocational discipline. It also requires a basic understanding of computer science, but for some jobs, notably business applications, it is enough to merely understand the language du jour. Regardless of how terrible the code is, from a business perspective, someone who produces code which can be shipped in a short period of time is a good programmer. The corporate bean counters could care less about things like correctness and maintainability, and are more interested in the state of accounts receivable. The programmer who helps out the accounts receivable side will be better liked regardless of the quality of his code, and probably promoted to management.
    --
    The society for a thought-free internet welcomes you.
  69. Engineers need physics by argent · · Score: 1

    An engineer still needs to take quite a bit of physics.

    I don't want an engineer who doesn't know what "specific heat" means, and I don't want a programmer (whatever you call him) who doesn't understand computability and complexity.

  70. Throw yourself over the waterfall model! by argent · · Score: 2, Insightful

    Then again, maybe it's just because my team has alternating making me want to kill them and myself for the better part of the semester...

    You're ready for a job in the software industry!

  71. Computer engineering vs computer science by volkris · · Score: 3, Insightful

    IMO there needs to be a starker contrast between computer science and computer engineering, just as there's a contrast between "real" engineering and, say, physics.

    Those who just want to be able to program, who are focused purely on employability right out of college, can look for computer engineering courses teaching the popular programming languages. These people can be fine programmers, ready to start... so long as the language popularity hasn't changed by the time they graduate. It would be sort of advanced vocational program, just like any other engineering.

    But the real scientists, those who want to experience and express code on deeper levels, should be looking for something very different, that which Dijkstra describes. Just as a scientist and an engineer can work on the same project contributing different skills, the computer scientist has his place even in the real world.

    The two really are different mentalities, and it seems that the mixture of the two leads to situations that are non-ideal for either.

    1. Re:Computer engineering vs computer science by KeithIrwin · · Score: 1

      Do you live in some weird alternate reality where "computer engineering" means something other than "the study of the design of computer hardware"?

    2. Re:Computer engineering vs computer science by volkris · · Score: 1

      Guess so.

      At both universities whose programs I am/was familiar with, computer engineering was not hardware focused.

      Then you get into various job titles along the lines of "software engineer", "computer engineer", "systems engineer", etc... all referring to a position dealing with writing code.

      So yeah, in my experience quite a lot of "computer engineering" is software focused.

      Of course, that's completely beside my point...

    3. Re:Computer engineering vs computer science by khallow · · Score: 1

      The two really are different mentalities, and it seems that the mixture of the two leads to situations that are non-ideal for either.

      A mixture may not be an ideal computer scientist or engineer, but it does seem to me superior (as in much more useful) to the extreme ideals.

    4. Re:Computer engineering vs computer science by volkris · · Score: 1

      Various comments above reflect my thoughts on the matter: the mixture of extremes (really they're not particularly extreme) gets you the worst of both worlds.

      Those who just want to learn Java, C, and C# are stuck with a half-assed attempt to teach formal mathematical methods--basically have their time wasted on brain teasers don't coalesce into real-world skills--while those who want to actually study the science behind data processing are bored to death installing eclipse and underserved in general.

      The latter is certainly what happened to me, and why I jumped to physics. The computer science degree at my university had nothing to do with science.

    5. Re:Computer engineering vs computer science by khallow · · Score: 1

      The latter is certainly what happened to me, and why I jumped to physics. The computer science degree at my university had nothing to do with science.

      No offense then, but I don't think you picked up the right lessons. I'm in the process of finishing a PhD in pure math and yet I find the practical experience of software engineering that I have quite valuable. There's a synergy between abstract and practical knowledge.

    6. Re:Computer engineering vs computer science by volkris · · Score: 1

      You miss my and Dijkstra's point.

      Of course there's a synergy between abstract and practical knowledge... but very important, informative, and enlightening areas of abstract knowledge are being sacrificed for the sake of the practical.

      We're not suggesting teaching of these wondrous ideas just for the sake of knowledge (not that there's anything wrong with that), but for the sake of contributing something great to the practical task of "composing" software.

      Right now the pursuit of immediately practical, "easy" bodies of knowledge like specific programming languages and environments is taking priority over the deeper insights, blocking that stuff out. The confusion between computer science and computer engineering creates a situation where departments are pressured to teach the industry state of the are instead of the larger truths that might serve students better in the long run.

      Imagine if your math departments taught precisely the same curriculum to engineering or business and math majors. That's about the state I'm describing.

    7. Re:Computer engineering vs computer science by hobit · · Score: 1

      In most of the US at least, computer engineering is about the design and low-level use of computers. So VLSI, computer architecture, embedded systems, systems programming.

      I've never heard the term used they way you are using it. Wikipedia seems to agree with me...
      http://en.wikipedia.org/wiki/Computer_engineering

         

      --
      As Nietsche famously said, "If you stare too long into the Abyss, 1d4 Tanar'ri of random type will attack you."
    8. Re:Computer engineering vs computer science by volkris · · Score: 1

      I'm most reminded of past Slashdot stories about fights between programmers and state governments over the use of the term engineer.

      The states were arguing that software developers shouldn't be allowed to call themselves engineers since many of them had no degree, no relationship with a professional organization, and in general no standards to maintain the integrity of the term that's so highly regarded in other disciplines.

      The developers argued, among other things, that use of the term to describe software developers was well established and therefore above the law.

      So yeah, I'm surprised the Wikipedia article doesn't mention the controversy over the term, but it's definitely a real issue and hilights use of the term as I've used it.

    9. Re:Computer engineering vs computer science by khallow · · Score: 1

      Of course there's a synergy between abstract and practical knowledge... but very important, informative, and enlightening areas of abstract knowledge are being sacrificed for the sake of the practical.

      Well I can see this being true. But it's a different complaint than the one that somehow abstract and practical knowledge are immiscible.

    10. Re:Computer engineering vs computer science by volkris · · Score: 1

      Here's one for you:

      In the abstract sense the abstract and the practical aren't immiscible, but in the practical sense they sometimes are :)

      For example, someone with a mindset of wanting to program Java immediately is not going to happily sit through Dijkstra's lectures on abstract philosophy of programming beginning with his made up, uncompilable language.

  72. Re:Handwriting? How about a Font! by JoshDM · · Score: 1

    Yeah, I know. What can I say? Sort of a force-of-habit as I'm a bit used to another (very lousy) forum (that I have no control over) which splices a supplied standard urls ("too long a word for input") into smaller chunks.

    For those of you who are playing at home, the TinyUrl points to http://lucacardelli.name/Fonts.htm

  73. An interesting look... by Q-Hack! · · Score: 1

    While I agree that he talks about many issues that effected the computer industry as a whole, I believe that society has worked through many of these issues. As an example:

    (4) The military, who are now totally absorbed in the business of using computers to mutate billion-dollar budgets into the illusion of automatic safey.

    The military learned early on that computers are not the end-all-be-all to combat. It still take grunts on the ground to win the battle. Computers provide a means of sorting information. They are nothing more than a tool much like the riffle is to the infantry. (Sorry, I had to use one of those analogies that Dykstra is so fond of hating.)

    Another thing Dykstra talks about, is that society changes at a slow pace. This too is a paradigm shift. While we were, at one time, accepting of change over generations. With the advent of the internet most of society now accepts change in the terms of just a few years. (ex: How long did it take Wikipedia to become accepted as a reference for college papers?) It is the ease of which we are able to pass on information that has allowed this to happen.

    --
    Some days I get the sinking feeling Orwell was an optimist.
  74. An interesting point of view by Anonymous Coward · · Score: 0

    Bachelor degress have become a fluid generic form of certification. The first degree attained mostly by the efforts of the student, independent of their family. At least intellectually. Financially its a totally different matter. The purpose of that certification is usually a job interview if not the first job. Its unfortunate that only then does the student truly become aware of their job function and duties, and sometimes they are very unhappy. But what does this have to do with the essay at issue? I think it has to do with the rather elitist point of view that education exists for the the sake of education. That somehow being exposed to this way of thinking is better than another. Were this an essay on a graduate level topic it might have more merit.. and being a topic for the 80's perhaps it was more relevant then. But today with the cost of education so high, and more and more being carried by the student, I think it better the education programs advertise themselves as experimental or career oriented, or carter to, the job market.. and business. Being an educator is not a license to experiment on a person or their potential to make a living, or payback their student loan. It bothers me to think that as a student there was a time when I was purchasing one of the most expensive things I ever purchased in my life with little experience, and to think the person I was purchasing it from.. want to endow me with their point of view of the world just because they could.

  75. Re:Handwriting? How about a Font! by Anonymous Coward · · Score: 0
  76. Computer Scientists start counting at zero! by eples · · Score: 1

    Check it out, the first page is numbered "0"

    --
    I'm a 2000 man.
    1. Re:Computer Scientists start counting at zero! by Anonymous Coward · · Score: 0

      That is no joke. I had him at UT and it is completely instilled in me that 0 is the proper starting point. He was adamant about that.

      I lost my original comment in this maze of comments, but had said that his class kicked my butt. I think he had stooped down and taught an undergrad class... which I think he may have stopped prematurely because it went so bad... We sucked!

      I think he may have been a guest teacher experimenting or something because I don't think I had him for an entire semester.

      To this day I feel sloppy as a coder. Much of the problem is the complexity in dealing with gluing systems together... and things seemed kinked. I wish I could write more stand-alone perfect little chunks... if only.

      One thing that bothered me at that time, and still does, was/is the down-the-nose view of fractal geometry. I heard "pretty pictures, that's all it is".

      There's a certain amount of sloppiness that I think is human... like the impressionist art.

      I'm probably wrong, but I think Dijkstra was battling/toying with the unknown, his fears.

  77. Unabomber of Computers by gelfling · · Score: 1

    We get Lenny. And you're nuts.

  78. Remember what you are saying... by HonIsCool · · Score: 3, Insightful

    Everyone who is arguing against Dijkstra and saying that programing is about engineering, not writing formulas or proofs, remember your words when the software patent debate pops up again...

    --
    "Give me six lines of C++ code written by the most competent programmer, and I will find enough in there to hang him."
  79. Rality by danieltdp · · Score: 1

    There is nothing more fascinating than learning how computers really work.

    Yes, there is: learn how reality works. I am a physicist and nothing beats the feeling when you get some insight on how the universe behave

    --
    -- dnl
    1. Re:Rality by Anonymous Coward · · Score: 0

      So how's that grand unified theory coming along, and the whole thing with String Theory then?

    2. Re:Rality by danieltdp · · Score: 1

      "To get some insight" is not the same thing as "understand". This is one of the most beautiful things in physics: you know that you will never fully understand anything, but still you go on with the hope of just progressing towards an unreachable goal

      --
      -- dnl
  80. Choose a different line of work? by typidemon · · Score: 1

    Computer Science is larger than understanding how computers work. How about understanding how people work with computers?

  81. Re:Reality by Bozdune · · Score: 1

    Agreed.

  82. Understanding math vs. Using it on programs by billstewart · · Score: 1

    Yes, Engineers understand math, at least to some extent. (I was surprised in grad school about how much more rigor was possible compared to doing the same material as an undergrad or high school student :-) And some kinds of engineers use appropriate math for what they're doing. Dijkstra's arguing here that software engineers generally don't. Sure, we'll occasionally apply order-of-magnitude math to our algorithms, deciding whether an N**2 or NlogN is a better choice for the size of data we're dealing with, but computer scientists have been bitching about the lack of use of program-correctness proofs for at least a decade before Dijkstra's talk, and even though our computers are 4 orders of magnitude faster and 6 orders more price-performing than when he wrote the talk, we still consider that stuff too inefficient for practical use and write lots of buggy code.

    A simpler example than proof-of-correctness is input validation. A program is designed to take a given set of input and produce corresponding outputs, so one way to improve program correctness is to start by specifying the input set and validating whether the input the program receives is in that set and reject it if it's not. (Replaces "Garbage In Garbage Out" with "Garbage In Error Message Out".) My CS100 professor emphasized that ~30 years ago and made us run all of our homework programs on maliciously designed input, but how many of the security bugs you see today are still buffer overruns or stack smashing or other because people aren't bothering to define and enforce the valid input sets. It's improved a bit with object-oriented programming because objects are a bit more restrictive in what kinds of input they'll accept, and many of the popular objects validate their input and are almost as easy to use as similar objects that don't, as opposed to rolling your own lazily or using C's getwhatevers().

    I partly blame Knuth for this :-) His books were the canonical algorithm books for a generation, and did the math really really well, but did programming examples in a baroquely ugly assembler language or spaghetti-pseudocode when better languages were available (e.g. Algol or cleaner assemblers), and that made it hard to learn how to apply his mathematical techniques to real programming.

    --

    Bill Stewart
    New Fast-Compression-only CPR http://preview.tinyurl.com/dy575ks
    1. Re:Understanding math vs. Using it on programs by xenocide2 · · Score: 1

      Dijistra's entire point is that proof-of-correctness is the only way to get correct programs, and the industry has chosen to ignore it even as they mire in a cess pool of buggy software because it's too radical. Not too computationally infeasible; too radical. A small error in software can lead to a huge disaster, in contrast to every day life. We know this, and generally try to pretend it doesn't apply to us -- we don't write rocket software, we don't write real time systems. And hell, we only write a small fraction of the software we use. But I think few of us bother to quantify the price of bad software for our company or clients.

      Since he wrote this, I suspect a worthwhile rebuttal has been discovered: the fundamental error Dijkstra makes is assuming it's possible to find a specification worth proving the program against. In many cases, the hardest part is figuring out just what the hell is needed, not putting it into C or Java. On the other hand, my alma mater does teach freshman proof of correctness, but as a secondary course rather than in a "intro to programming" course. Simply put, far too many programs want an intro to programming course but feel a programming proof course will raise dropout rates.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

    2. Re:Understanding math vs. Using it on programs by theaveng · · Score: 2, Insightful

      What's wrong with raising dropout rates in Computer Programming? When I studied electrical engineering, we started-off with Calculus, Linear Algebra (matrices), and Physics. i.e. Pretty boring for most people.

      People fled engineering in droves because they didn't want to do the math. Starting with "hard" or "boring" courses weeds-out who should be engineers and who should do something else. If computer programmers are not willing to do math required to create solid software, maybe they should be weeded-out too, so what's left are the individuals who truly belong in that profession.

      --
      FOX NEWS.com should be BANNED from television and internet. Have the Congress take it over and give us Truespeak.
  83. python by Anonymous Coward · · Score: 0

    I personally just endured a semester of java (software construction) where the assignment was fun (game of life on a 2020 board) and I enjoyed writing the code. The lecturer then marked me on the running application and didn't even read my (in my view well commented and probably naive code) of which I was a little proud! The exam then had lots of boring stuff that he was droning on about in the lectures, I asked about a concept in an email once and was given links to a website from 2000 !!! Surely even java has changed a fair bit in 8 years?

    So my point is python is better at simple code, lets move CS courses to python and even contributions to real world OSS applications.

  84. javascript is the root of all evil online nowadays by Anonymous Coward · · Score: 0

    "And JavaScript takes all that and gives you LISP power" - by 0xABADC0DA (867955) on Tuesday December 02, @12:17PM (#25961763)

    Correction:

    "AND JAVASCRIPT TAKES ALL THAT AND GIVES YOU VIRUSES/SPYWARE/TROJANS/ROOTKITS/MALWARE-IN-GENERAL ON THE INTERNET NOWADAYS, & 95% of it"

    That'd be FAR more accurate, unless LISP is an abbreviation for 'Live Internet Suckers for Prey' or something that is... lol! ... & anyone here is free to verify THAT statement/correction of the person I quoted of mine, over @ SECURITYFOCUS.COM &/or SECUNIA.COM (as 2 security based websites that track that type of information), anytime, to check its veracity.

    Above ALL else? FIX THAT JAVASCRIPT DOM (document object model)...

  85. Dijkstra bought a Mac! by V.11.1997 · · Score: 2, Interesting

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

    Dijkstra did own a computer. He bought a Macintosh:

    "Even after he succumbed to his UT colleagues' encouragement and acquired a Macintosh computer, he used it only for e-mail and for browsing the World Wide Web".

    Source: U. Texas CS Department (In Memoriam): http://www.cs.utexas.edu/users/EWD/MemRes(USLtr).pdf

  86. Not sure I agree by allcoolnameswheretak · · Score: 1

    I'm not sure I fully agree with the article. Metaphors can help in better assimilating new knowledge by making it more natural to work with. Think about what object orientation has done for programming. If we had done as Dijsktra suggests and approached software engineering with an "open mind" maybe we would still be coding in assembler, as that is the "purest" way to interact and think the way computers do.

    1. Re:Not sure I agree by Ymerej · · Score: 1

      I'm not sure I fully agree with the article. Metaphors can help in better assimilating new knowledge by making it more natural to work with. Think about what object orientation has done for programming. If we had done as Dijsktra suggests and approached software engineering with an "open mind" maybe we would still be coding in assembler, as that is the "purest" way to interact and think the way computers do.

      There you go anthropomorphizing the computer again.

  87. Chrysocosmic by Arterion · · Score: 1

    What does this word mean? I googled it, and all that was returned were copies of this article.

    --
    "That which does not kill us makes us stranger." -Trevor Goodchild
  88. MIT Scheme.... by davidhk · · Score: 1

    While this langauage has been implemented...MIT's Scheme is pretty close to a programming language that will never be used in the real world. I thought that it was an excellent way to learn programming outside of the other more practiced languages. There are two problems with his arguments. 1) It doesn't matter if schools press for their students to push their knowledge outside of their comfort zone. There are a wide range of educational offerings available from community colleges to private Unviersities. Students usually try to select their educational challenge based on a wide variety of factors. Prof. Dykstra discussed that the universities should push the students beyond their comfort zone into these radical novelties. Maybe he was teaching at the wrong school. Or maybe he was compelled by his department to dumb down his curicula, but I seriously doubt that every CS department tries to dumb down their education the way he described. The free market let's students decide the type of education they would like. If they want a CS challenge, there are plenty of offerings out there. 2) Not all people are as smart as Prof. Dykstra would like them to be. Even if you found a person with an 100 IQ that was interested in learning higher level abstract mathematics and their application to programming, that person would not be suitable for this education. Most people are very capable of self determining the maximum level of intellectual challenge they are up for. Even if they can't afford to go to some of the more expensive private universities, someone that is very intellictually capabale but financially challenged should have a very wide variety of resources available, including unviersity course access via the Internet.

  89. Swapping two variables requires a third? by DamnStupidElf · · Score: 1

    What about a ^= b, b ^= a, a ^= b (for integers)?

  90. Re: IT'S NEEDED *NOW* by neonsignal · · Score: 1

    Needed? So why didn't the world fall apart when the fandangled realtime airline-pricing-optimization system got delivered two years late, way over budget, and full of bugs?

    Twenty years after Dijkstra wrote this, the situation has not improved; arguably it is worse. Programming has changed from a mere craft to sorcery. How do we solve a problem now? Consult the oracle of google, randomly select an entry, and cut and paste some magic code or call some totemic library. Still doesn't work? Chant some testing incantations. After a while the customer decides that they've run out of time, and decides that near enough to spec is good enough (after all, the spec is not very formal, and can be stretched to fit the program!).

    Sure, I'm exaggerating. But when nine out of ten 'software engineers' don't even know what an invariant is, there is a failure of education. Especially now, when most programmers are not coming out of elite universities (which still teach computer science), but out of tech courses.

    No, we don't use formal principles to design our complex software projects. But it isn't because time doesn't permit. It is because we don't know how to.

    We call it software engineering, but traditional engineering does work from formal principles, and then refines the parts of the construction. We know that doesn't work for software, because of orders of magnitude more complexity, and interactions between parts of the system. Symbolic digital computation is a paradigm shift.

    Why does it matter? Because we aren't just talking airline systems. Twenty years ago the big deal was the missile defence system 'star wars', which was to be a larger software project than anything in existence at the time. The potential harm from the failure (at runtime) of such a project is not worth contemplating. Maybe your airline system is not important (!), but some of us write code that has life threatening consequences if it fails. So we welcome any advancement in the theory of programming, and in the teaching of that theory.

  91. Goedel's Interesting But Useless Theorem by Anonymous Coward · · Score: 0

    Goedel's Incompleteness Theorem actually doesn't hold for any description of human knowledge. For example, one of the first premises of the theorem is that the field of possible symbols is finite, which isn't true of human knowledge. There is always another symbol to represent a new idea - actual human knowledge is an open system.

    There are other objections, but that's simply the most basic (and obvious).

  92. The electron. by mcmonkey · · Score: 1

    That's all fine and dandy. But how to teach people about electrons?

    Without analogies to properties of electrons which are wave-like or particle-like, how do you say anything useful about an electron to anyone who isn't already a particle physicist?

    Ayn Rand said it well, if your base premises lead you to contradiction, you must examine your premises. Rather than be driven crazy about how an electron can be like two things which are as different as a particle and a wave, you should question your assumptions.

    Are particles and waves so different from each other? And why should there be any dissonance in any one thing having properties of both? I have the accented english of Arnold Schwarzenegger and the physique of Danny Devito. Are you now driven crazy on how I could be like two such different people?

  93. Greenly by Anonymous Coward · · Score: 0

    At Georgia Tech, when Greenly was in charge of beginning programming for undergrads, cruelty was the norm, and I think it probably made better programmers out of the bunch that squeaked by. Added pain was Nick Black, but that TA was legendary for other reasons.

    Shout out to Phat Joe.

  94. Dangerous teachings by Anonymous Coward · · Score: 0

    Dijkstra is right that you need to teach mathematical formalism to students. He is wrong when he says it has to replace the practical teaching of languages and tools. I was taught in his school of thought, and I have had a lot of catching up to do. I'm really good at architecture issues and deriving an algorithm is a breeze, but it has taken me a long time to learn the "carpentry" skills of programming. They were scoffed at in the CS dept of my university, and I believed what they said for a long time.

    These days I do test driven development, a discipline that is heavily derided in Dijkstras paper, and it is the best practice I have learned in software development. His thesis is that when you have proven that your program fulfills the formal specification, your work is done. He forgets that the specification can be, and usually is, wrong. The hard part of programming is to produce and interpret the specification, not to implement it.

  95. C subset is better first by butlerm · · Score: 1

    Stroustrup is wrong (or perhaps over-enthusiastic about teaching C++ to beginners). If it were any other language, sure, but using C++ for anything but trivial applications without a knowledge of C is an exercise in futility.

    For example, you can't use "new" for anything (other than wasting memory) without using pointers in C++, so one better have some semblance of an idea about how pointers work before trying to write anything that doesn't look like a FORTRAN program.

    The problem is that (for all its benefits - and there are many), the design of C++ is forever compromised by the requirement to be backwards compatible with C. String literals aren't strings, they are *pointers* to a series of signed eight bit integers. When new objects are allocated, by default they contain random garbage data. No array bounds checking anywhere. Does a language really need both references *and* pointers? Other than backward compatibility?

    I wouldn't dream of teaching C++ to anyone who didn't have a working knowledge of C, because using C++ to do anything worth the extra complexity of the language requires it - and a lot more.

  96. most of us do have computers by wikinerd · · Score: 1

    It's wrong to say that one has never owned a computer. Most humans do have computers, because our hands are computers. Our brains are also computers, as are our whole bodies. Computers are everywhere, even in non-living things, if you know how to recognise them. In fact we are living in a huge computer. So, the summary should say that he has never owner a digital electronic programmable personal computer.

  97. Whooping by Anonymous Coward · · Score: 0

    I had Dijkstra at UT. I got my butt kicked. I'm still getting my butt kicked.

  98. Computer scientists *do* prove formulas by sentientbrendan · · Score: 1

    >Imagine that, a mathematician describing engineering as deriving a formula!
    >No comfortable analogies here...

    That's not an analogy. That's literally what computer science is. That you did not know that says a lot about why he wrote that article.

    They didn't decide that merge sort was a correct sorting algorithm by coding it up and running it a million times. A mathematical proof was given. No actual running computer is necessary.

    Furthermore, a computer program *is* a mathematical formula. It always has been. Dijkstra is pointing out that the curriculum has been so dumbed down that most programmers don't even know that.

    In this article Dijkstra correctly criticizing the fact that most programmers don't know how to prove the correctness of algorithms. The same could be said about asymptotic complexity. Most programmers do not understand these concepts well enough to write programs that don't run forever on large input values. This is a real problem.

    There are both analytical and empirical methods for dealing with computer programs. The analytical methods involves proofs of correctness and symbolic manipulation. The empirical methods involve software testing and debugging.

    Dijkstra certainly goes overboard by suggesting that software testing is totally unnecessary because he's not interested in such intellectually uninteresting problems as reliably detecting typos in 10 million lines of source code for a problem. Dijkstra correctly points out that software testing suffers from the fallacy of induction, but ignores the fact that induction is an important tool even if it doesn't prove anything.

    The truth is that most programmers are just code monkeys with no understanding of the *science* in computer science. That is what Dijkstra is railing against ultimately.

    1. Re:Computer scientists *do* prove formulas by WhiplashII · · Score: 1

      OK, I agree with almost everything you said as far as it goes...

      They didn't decide that merge sort was a correct sorting algorithm by coding it up and running it a million times. A mathematical proof was given.

      Excellent example - that is, indeed, "computer science". That is also not software engineering. Software engineering is taking that sort, and using it to solve a problem. There are an infinite set of provably correct sorting programs - deciding which one to use is software engineering, not "computer science". In my experience, computer scientists are essentially useless outside of the university - though, of course, there they are essential. (Maybe if you were constantly running into new and unusual computing issues, but lets face it, 99.9999% of the programming that happens today is deciding which tools to use where - not creating new tools...)

      In addition, "computer science" is not a science! You do not come up with experiments to prove various things incorrect - you work by mathematical proofs. So it should be called "computer math", not "computer science". But that does not mean that software engineering doesn't exist - it means that software engineering is not computer science. And we need a lot more software engineers than computer scientists, just like we need a lot more building engineers than physicists.

      --
      while (sig==sig) sig=!sig;
  99. C is an excellent teaching language by sentientbrendan · · Score: 1

    >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.

    C is an excellent teaching language. It has a relatively simple syntax, and doesn't hide anything under the covers. In a similar way assembly is also an excellent teaching language.

    It teaches the user about memory addressing and memory management, which are important topics no matter what language you use. It also teaches the user how to do the elementary logic and understanding of flow control that constitute the early stages of learning how to program. It does all this without forcing the learner to memorize unnecessary syntax.

    Conversely, while C is an excellent teaching language and a poor language for real world use, C++ is an excellent language for real world use, and a poor teaching language.

    I expect there will be some inane comment about how C++ sucks from someone who tried it once and thought it was too hard to learn how to use. My response is simply, "don't be such a baby." Real programmers use C++.

    1. Re:C is an excellent teaching language by 91degrees · · Score: 1

      Assembly is definitely a language that I would encourage any programmer or computer scientist to learn, at least at a basic level. When you're at that level of abstraction, what pointers do is a lot more logical, and that seems to be considered one of the most useful features and one of the most confusing features of the language.

  100. Re:You are the typical head-up-arse programmer by Anonymous Coward · · Score: 0

    On the contrary Dijkstra is entirely right on this score. I started with Basic and it took me years to understand the need for understanding formal methods and more, much more time than it should have to learn to properly apply them if I'd learned from the beginning.

    It's very easy to switch from writing proofs along with your code to writing the sort of stuff you typically see in on the job. It's nearly unheard of for the sort of hack (not hacker) that was weaned on Basic to either understand or understand the value of experience with formal methods.

    Sneering at formal methods (I know, formal methods are not a panacea) is prima facie evidence for being a typical head-up-arse hack who sits next to the person who brags about the emphasis their software engineering curricula put on soft-skills like use case analysis, user interface design, project management and finance to the detriment of actually understanding what a computer is and what it might be good for and what it might not be good for.

    It's amusing to note that while computer science is not an engineering discipline, those soft skill topics aren't a major emphasis of any other engineering bachelors curricula either. That's not to say that those topics are irrelevant to the job, there just isn't time to fit that in and still end up being an engineer.

    If you won't buy this argument from me an anonymous coward, then buy it from Carnegie Mellon whose reputation as a software engineering school is pretty much solid gold. Those folks teach formal methods from the beginning.

    http://www.cs.cmu.edu/prospectivestudents/undergraduate/index.html

    It's interesting to note that Carnegie Mellon's justly famous Software Engineering Institute *doesn't offer* a BS or any other degree and is managed separately from any academic department.

  101. Your twisting my words... by jonaskoelker · · Score: 1

    So, his Macintosh wasn't a computer?

    It couldn't have been his, you know, personal computer ;)

  102. computer SCIENCE is a SCIENCE.... by Anonymous Coward · · Score: 0

    I may be mistaken in this (my degree is in physics, not computer science) but it has occurred to me that computer science is, in fact, a science. If you want something ultra-practical, go take some vocational classes or something of that sort. If you want to be a server admin, many tech schools now offer information technology programs. If you want to develop software, it seems to me (though correct me if I'm wrong) that the best path to pursue would be software engineering. Computer science is, under my understanding, supposed to be that area of science concerned with topics like the theory of algorithms and Turing machines and so forth, and not so much with such mundane details as to what particular line delinimination is used in such and such a language or what protocols are now supposed by Windows Vista. Physics, chemistry, and biology do not strive to be their engineering counterparts; why shouldn't computer science be just as abstract? (and I suppose, on some level, just as useless?) Besides, my understanding is that the point to having the abstraction is that when faced with potentially new systems, those with CS degrees won't be obsolete or incompetent.

  103. esl, 2;-) by Anonymous Coward · · Score: 0

    > try to get away with the concepts we are familiar with

    i assume he meant "get away_from_" but maybe he was just trying to get away with something;-)

  104. Coder make it possible for you to use a computer by Anonymous Coward · · Score: 0

    "I can actually now use a computer, unlike much of the coders I come across" - by noldrin (635339) on Tuesday December 02, @09:58AM (#25959423)

    Then the people you meet calling themselves coders aren't. Coders make it possible for you to have the programs you USE, Mr. user. Who is the moron who modded this fool up as "insightful"?? I strongly suspect he modded himself upwards that way via an alternate logon, or that people at this website are fools also, especially if they do not realize the very simply point my first sentence makes, which is common sense.

  105. Re:Do you really need that CS degree? It depends.. by Anonymous Coward · · Score: 0

    I agree with ted, mostly because I am in the same boat as him.

    One difference though, when I did my CS degree I had a teacher who taught my C, C++, data structures and algorithms classes who did not hold you to the math prerequisites to the class. This guy used to be a math a physics teacher, and his reason for not requiring math was simple, "you are using logic, not math to program". He said why invent the wheel if it is already there. That is not to say he was an easier teacher. When we did data structures and algorithms in C++, we were not allowed to use stand template library. We had to do everything from scratch, including pointer arithmetic.

    Was it a bitch of a degree to get, yes. Would I do it again, yes.

    Call me a masochist.

  106. What about Konrad Zuse? by Zero__Kelvin · · Score: 1

    What about Konrad Zuse? You are clearly forgetting Zaphod Beeblebrox!

    --
    Guns don't kill people; Physics kills people! - John Lithgow as Dick Solomon on Third Rock From The Sun
  107. Re:Handwriting? How about a Font! by JoshDM · · Score: 1

    If you weren't anon and this a couple days old, I'd say mod parent funny!

  108. Nope... we're living in a golden age. by EWAdams · · Score: 1

    What's wrong with the world can largely be attributed to the usual things: Chinese, Russian, and American policy on a wide variety of subjects, plus petty-minded xenophobia that keeps the Hutus and Tutsis, or Palestinians and Israelis, at each others' throats. Nothing to do with how we teach computer science, I assure you.

    --
    I piss off bigots.
  109. Re:You are the typical head-up-arse programmer by bdijkstra · · Score: 1

    After BASIC, I was glad to encounter programming languages that could be used to solve complex problems, and made it possible to understand complex programs.

    So the dead Dijkstra was wrong, and the living Dijkstra is right.

  110. My sarcasm detector may be broken, but... by epee1221 · · Score: 1

    I think you're missing the point. Yes, the program is fairly easy to write. The issue is that it will take a very long time to run on problems of non-trivial size.

    --
    "The use-mention distinction" is not "enforced here."