How you know you’ve made a difference

I received this a few seconds ago in my mailbox. It’s not especially unusual for me to get wow-you-changed-my-life email, I see two or three in a typical month, but this one is…well, I’ll say a bit more intense than usual. Also, 34 is an unusual age; they tend to be teenagers. Sender’s name masked and one bit turned into a live link. Otherwise unedited, typos and all.

I just finished reading your [Hacker HOWTO] for the second time in as many
days. All of my life I have wanted to be a programmer. I have never
done it. I dealt with the failure of that by downloading cracked
software and telling myself that I was a “hacker.”

When I clicked on the link to your guide, my intention was to get
started on the road towards what I envisioned a hacker to be.

By the end of your guide, I was wallowing in humiliation. I felt…
well basically I felt like a jack ass. I never even knew what a
hacker was. I wasn’t even a cracker, just some poser with no
ambition.

Your guide showed me that any of my few contributions to the cracker
community were meaningless, juvenile ploys for attention with no
progressive merit. They won’t matter in 6 months because I haven’t
‘built’ anything.

After reading your guide, I began to research and really appreciate
the open source community. I saw that the degree of separation
between us wasn’t to huge of a gap and I realized that I could,
through dedication and hard(but fun) work, be part of something that
is growing and giving. A place where individual contributions aren’t
lost in the grand scheme of things, but help shape that scheme.

I am 34 years old and I have no problem admitting to you that your
guide made me feel like a complete ass. It also directed me to an
ideal I will be proud to contribute to.

For that, I thank you Sir.

XXXXX XXXXXX

I replied by quoting “I saw that the degree of separation between us wasn’t to huge of a gap” and said “I’m glad you got that far. Good luck on your journey.”

And that, ladies and gentlemen, is how you know your life has made a difference.

135 thoughts on “How you know you’ve made a difference

  1. …they tend to be teenagers.

    True confessions time: I was one of those teenagers. For me it wasn’t the Hacker HOWTO, it was Dancing with the Gods, and it led me to write this.

    It occurs to me that I might have made it to the age of 34 believing that I didn’t have the chops to be a programmer if I hadn’t discovered Python. The combination of intuitive and good-habits-encouraging syntax with a standard library expansive enough that you can start accomplishing useful things surprisingly soon made the learning curve seem less, um, wall-like than that of most any other language. Result: I’m now starting to dabble in at least reading, if not writing, sources in some of those other languages that used to daunt me totally.

    C-heads may commence telling me that I still won’t be a real programmer until I grok pointers… now.

  2. Phil R. wrote:
    >what Eric calls ‘the drunken monkey of the mind’ is the only part of my awareness that I trust

    I don’t have any problem with that, really. There may come a time when you need other kinds of awareness to become part of your toolkit. At least you’ll know they’re possible.

  3. And, with any luck, should a theophany sneak up on me, I’ll be able to recognise it for what it is without feeling as though I have no choice but to turn into a fundie, as the chaplain of my school used to think I eventually would.

  4. I have no idea why I ended up here…sometimes I wonder if I made a huge mistake.

  5. >C-heads may commence telling me that I still won’t be a real programmer until I grok pointers… now.

    Fuck that noise. I’m as gnarled and grizzled a C-head as you’re ever likely to meet (27 years at it) and I have no patience for that sort of elitism. If you can write good code with the tools of the day, you’re a real enough programmer.

    There are good reasons to learn C, but passing some old fart’s idea of a dick-size test is not one of them.

  6. Bollocks. If you can’t wrap your head around pointers you’re destined to be a shit monkey-ass cubicle fuckwit.

  7. In about 1995 I rewrote the inner loop of a crypto algorithm, swapping out pointer arithmetic for explicitly indexed array references.

    That tiny change got me a 15% performance boost. (RS/6000 target using the IBM compiler of the day.)

    Made me a believer that compilers are far better than me at micro-optimization, particularly if you give them enough information to know what you’re REALLY trying to do.

    Show me a programmer proud of the time he spent polishing pointer arithmetic inside a tight loop to “save” an addition or two, and I’ll show you someone who doesn’t truly understand the last 15+ years of multi-layer cached processor architecture evolution.

  8. Now, Dan, that’s not necessarily true. There are many paths to enlightenment, and C is but one, though a well-trodden one.

    Parallel: I’m becoming more and more convinced that Eric’s dictum that one should write simple code and only make it complex when you have an existence proof that it is needed is the right way to go. Despite my recent experience, the compiler has, generally, been my friend.

  9. Bollocks bollocks bollocks

    I don’t care if all you’ve ever written is Flex code….if your mind can’t grasp the essential nature of pointers – you’re probably an Indian commodity monkey-code grinder.

  10. Speaking of paths to enlightenment:

    Those who haven’t read it should read “The Tao of Programming” – a short, tongue-in-cheek look at programming.

    it contains such maxims as “Do not program in COBOL if you can help it”

  11. >I don’t care if all you’ve ever written is Flex code….if your mind can’t grasp the essential nature of pointers – you’re probably an Indian commodity monkey-code grinder.

    Such unseemly rigidity in one so young. Tch. 1985 called; it wants its conventional wisdom back.

  12. >I don’t care if all you’ve ever written is Flex code….if your mind can’t grasp the essential nature of pointers – you’re probably an Indian commodity monkey-code grinder.

    There is no reason you can’t write code for arbitrarily complex programs, correctly, without knowing about pointers (or any other kind of mutable state for that matter). The real tragedy is that most programmers don’t know the semantics of their chosen language, whatever that may be. Dan’s opinion is just a side-effect of living inside such a small box.

  13. There’s nothing hard about pointers — you just have to teach people a little bit of computer architecture first. Once you understand that all of memory is like one giant array, indexed by address, and that all the CPU really does is loads, stores, and arithmetic, it all makes sense. You really need to build that mental model first.

  14. I have the same story , but I was 23 when I saw your holy essay . I was studying Electrical Engineering at that time , but by reading your essay I absolutely switched to Computer Science after graduation , and I never looked back .
    Though I’m still on my journey and there are lots of stuff to do , I definitely enjoy the path ; second by second :)

  15. Eric’s dictum that one should write simple code and only make it complex when you have an existence proof that it is needed

    Ahem. That’s Occam’s razor.

  16. >Ahem. That’s Occam’s razor.

    Related to it, but not quite the same. See this from my last book; it’s why Jay refers to “Eric’s dictum”.

  17. Such unseemly rigidity in one so young. Tch. 1985 called; it wants its conventional wisdom back.

    lol :)

    I think the problem lies in t’other direction – I’m too long in the tooth. I’ve heard all this “you don’t need to know low-level stuff to be a good programmer” before, and it’s almost always been a smoke screen for suckiness. I have no idea why you’re parroting it esr…it’s just nonsense.

    This isn’t about C or pointers per se….I truly don’t care if all you’ve ever hacked is Ruby….and it’s not about elitism or stupid geek pissing contests… it’s about demonstrating the mental capacity for such an understanding. Without it, you’re not much count.

    It’s not like it’s hard, FFS, but it’s pretty damned fundamental to computer science.

  18. C-heads may commence telling me that I still won’t be a real programmer until I grok pointers… now.

    Bah. Anyone that closed-minded needs to be put out to pasture. That being said, there’s nothing hard about pointers. A pointer is just kind of variable that holds a location in memory that points to the actual data.

    Think of a string in Python. It’s a bunch of characters between quotes, right? Well, C doesn’t actually have a “string” variable type. Instead, it uses the ‘char *’ notation, which is literally a pointer to a character. The ‘char *’ variable holds the memory location where the string starts. The end of the string is usually determined by the placement of a trailing null character (a value of 0). Functions like strcpy() scan the string byte-for-byte starting at the specified memory location, and stop scanning when it hits the null character. Internally, this is exactly how the Python interpreter operates on strings, since it’s written C. :)

  19. Parallel: I have done something similar, and the result was about 50% performance gain… basically, trading one mod for several additions, subtractions and comparisons. The resulting code was ugly, but fast.

    It was a part of an algebraic software which dealt mainly with modulo operations (like m%p), but about 30-40 per cent of the time, the argument m was between -2p and 2p. It actually paid off to do some subtractions and additions before jumping on the mod operation.

  20. But that was only one of two occassions when I was better than compiler optimization… in other N cases (N being very high) I am no match for the optimization processes.

    The other occassion was implementation of SHA-2 on an ARM chip (mobile phone) for Symbian OS.

  21. >I’ve heard all this “you don’t need to know low-level stuff to be a good programmer” before, and it’s almost always been a smoke screen for suckiness.

    I’ve heard all this “you absolutely need to know low-level stuff to be a good programmer” before, and it’s almost always been a smokescreen for old-fart syndrome. I refuse to succumb.

  22. It is nevertheless useful to have at least one “low-level stuff guy” on the team, especially if you work on a C++ project and majority of the progs are Java students who consider C++ a special flavor of Java with marginally different syntax.

  23. See this from my last book

    And anyone who wishes to become a truly wizardly Unix programmer would do far, far worse than spending the time required to read Eric’s book and understand it thoroughly.

  24. I’m sorry Eric, it still sounds to me like ‘Occam’s razor FOR CODE”. Could you explain the difference?

  25. > Java students who consider C++ a special flavor of Java with marginally different syntax.

    “The first thing we do, let’s remove all the templates”. Or something.

  26. The “low level stuff required” people, I think, are missing a crucial point. Hackerly skill is associated with being skilled at the low level, but does not require it. What is required, rather, is a fundamental ability to think in the same way a computer does: working methodically through the instructions given to the machine, in order, and only the instructions the machine actually has been given. Once you have that, understanding pointers is a mere detail.

  27. “The zero-th thing we explain is that when you freaking allocate the memory, you need to free it again. Yes, always.”

    “The first thing we explain is the fact that C++ uses static linkage for methods that are not explicitly marked as virtual.”

    … iterate next explanations :-))

    Just yesterday we had a weird problem which turned out to be rooted in virtual derivation from base ABCs + the virtual method table. Our good Java students did not appreciate what vtable was, so they spent some time chasing a suspected race condition between threads of execution. Only detailed examination of the pointers actually revealed the real thing.

  28. You don’t need to know low-level stuff, but it helps to have a mental model of what’s actually happening with your code. It also helps to have the source code to any libraries or external programs your code invokes. I’ve relied on a man page’s explanation of how something worked only to find out that the actual code doesn’t agree with it.

    Anyway, score one more person who knows what a “hacker” really is.

  29. Roger Phillips Says:
    > The real tragedy is that most programmers don’t
    > know the semantics of their chosen language,

    That is true, but I think the point Dan is making is that it is hard to understand the semantics of any programming language unless you understand the mechanisms underlying the semantics. It is hard to understand ideas like the difference between value and reference types (or whatever terminology your language uses) if you don’t understand ideas like the stack and the heap. You don’t need to call it the stack and the heap, but you need to understand the basic ideas. Moreover, it is extremely hard to understand the lifetime of an object in a garbage collected language without understanding the basic ideas behind pointers.

    Of course, if all your write is web applications or pretty graphics that are more about art than programming then you don’t need to understand either pointers or the deeper parts of the semantics of your language. However, it is hard to imagine anyone being described as an expert programmer unless they understand the full abstraction stack from transistors all the way up to Django.

    Of course you don’t need to think about transistors when you write a for loop, neither do you need to think about pointers when you are creating a new object. But to to fully grok what is going on requires a deeper understanding including pointers. It reminds me a little of Eric’s thoughts on Elvish names. He doesn’t know where they come from, but a deep understanding produces certain thinking patterns in the mind that are productive. Misunderstanding produces incorrect thinking patterns. So too with pointers.

    Of course, I agree with the earlier statements regarding hand optimization of code. But understanding pointers is about understanding how things work, not about implementing ineffective optimizations.

  30. > I am 34 years old and I have no problem admitting to you that your guide made me feel like a complete ass.

    He’s off to a good start. Is there any single skill in life more important than the ability to admit to yourself (if not others) when you were wrong? Some people can’t do that.

    Well besides breathing.

  31. That essay was a watershed for me as well. Not quite as dramatically as for this guy, but only because I was already a little further down the path. I was 14 then. Flash back to a year before that, when I had just spent three weeks in the script kiddie community before writing them off, because I had vague-but-correct notions about what a hacker really was, and these idiots clearly didn’t fit the description. I was already a semi-competent C programmer. I knew the story of Ken Thompson and the backdoor-generating compiler. I knew what magic smoke was. My role-models at the time were the parents of a friend from elementary school, who both worked on the OS/2 kernel for IBM. So when I saw what a pathetic bunch the EFNet #hackers crew was, I concluded that the legendary hackers of yesteryear had grown up and joined IBM and that I would have to do the same before I could accomplish anything significant.

    So, fast forward back up to age 14. I had just gotten my first computer of my own (rather than a family computer) and out of no particular motivation decided to install Linux on it. I quickly acquired the basic command-prompt skills (no big deal, having been weaned on MS-DOS) and transitioned from Borland C++ to gcc. Then I came across the Hacker HOWTO. Then from there to CATB, and then the Jargon File and its “portrait of J. Random Hacker”. That was when everything fell into place. The people who I wanted to be still existed and I didn’t have to wait until I could get a job with IBM in order to work with them. It was only a year or so after that that I could go back to the “How do I know if I’m already a hacker?” rubric and comfortably assure myself that I fit the bill.

    Last year I did a test. A friend, a junior-year CS student, had just told me on our LUG’s chat room that he’d aced what I knew to be a very grueling compilers course. I wrote back to him, “Nice! I dub thee hacker.”. The desire to compliment him was only a secondary motive. I was thinking of the Hacker HOWTO’s description of “gatekeepers” and I was seeing if others in the room would let me get away with the presumptuousness of handing out that title in such a way. I got away with it. It was a good feeling.

  32. Fun fact:

    In Scheme, (eq? 6 6) yields #t, whereas (eq? ‘(a b c) ‘(a b c)) yields #f.

    The reason for this completely counterintuitive result has to do with pointers. Indeed, both Scheme and Common Lisp contain several equality predicates with different semantics, usually depending on whether you mean “points to the same thing” or “is structurally the same” or “is the same within the semantics of a specific type”.

    Without a basic notion that values have locations in memory and that sometimes they are referred to by this location rather than by the value itself, maturity as a programmer is impossible. To become good, you don’t need to be able to do heavy pointer math, but pointers and their implications are intrinsic to the semantics of many programming languages. Even Java code monkeys have some grasp of the difference between by-value and by-reference arguments. (Or they should, if they want their code to be any good.)

    Even so, I think that lambda calculus — or at least some grasp of procedures as data — is more essential to programming practice than pointers. A lot of stuff — including how objects work — becomes clearer with this insight.

  33. Daniel Franke,

    You are correct.

    Substitute (eqv? 6 6) and (eqv? (list ‘a ‘b ‘c) (list ‘a ‘b ‘c)) for the above.

  34. Dijkstra once said, “Computer Science is no more about computers than astronomy is about telescopes.”

    Pointers are very much in the category of stuff ‘about computers’.

  35. Rob, Dijkstra may be right…but any scientist must understand the tools he’s working with. An astronomer need not know how to construct the telescope he’s using, but it’s a good idea for him to understand the limitations impose don it by the focal ratio and aperture of the mirror. The same goes for computers.

    With that said, I’m not sure that a hacker needs pure computer science in its classical forms. Yes, understanding the difference between an O(1) and an O(n**2) algorithm is highly desirable, but the arcana that are the stuff of CS PhDs are probably mot as useful to the average hacker.

  36. # rob Says:
    > Dijkstra once said, “Computer Science is no more
    > about computers than astronomy is about telescopes.”

    Yes, that is the sort of thing Dijkstra would say. However, the comparison is invalid on so many levels. Computer science is about the limits and capabilities of a computer, and so a computer is, in a sense, the raison d’être of computer science. (Computing science is a broader topic though it has largely been engulfed by computer science.) Computers are the equivalent of “the universe” in astronomy, not the tool used to examine the universe. Telescopes are more like the equivalent of compilers.

    However, this sort of quote confirms my general disdain of Dijkstra. I think he was greatly overrated. Since he was early in the field he grabbed a couple of low hanging fruits, and got this great reputation. Certainly his insight on goto had a powerful influence, but that is about it. Good gravy, the guy wrote his papers manuscript rather than using a text editor!

    Dijkstra is, in a sense, the polar opposite of a “hacker.”

  37. Dijkstra once said, “Computer Science is no more about computers than astronomy is about telescopes.”

    And I’m sure he felt very smug and wise whilst sagely offering such a nugget. Albeit a butt-nugget.

    Computer Science is about computation (generally speaking, anything that accomplishes this can be referred to as a “computer” – hence Dijkstra being full of shit). To facilitate this, data needs to flow and be transformed. How does this happen? Input, output, blinking lights, a buzz here and there, a puff of smoke…oh yeah….data and references to data…operations and references to operations….y’know…pointers.

    You may implement a pointer in C with an asterisk, but a pointer itself is an abstraction, and a fundamental one to compsci. To advise people that understanding such concepts is not important is just plain dumb.

  38. I wish I could say “How to Become a Hacker” was a watershed for me, but it really wasn’t. By 2001, I was already 29 and already writing code in several languages, including C on Unix and I was already hacking on Linux. Unfortunately, I never really had the time to sit down and write major applications or make a name for myself, like esr. By the time that essay was written, I had just finished off my degree and was working long hours as a Unix systems administrator.

    Probably my biggest influences were my high school Advanced Computer Operations (a 2-hour block vocational tech-type class that taught C, COBOL, RPG II, Fortran, and some other stuff on Unix) teacher who introduced me to C and shell scripting on Unix System V R3.2 in 1989, which made me realize that coding in Pascal on MS-DOS for BBS systems was nearly pointless. That and Russ Nelson’s MS-DOS text editor Freemacs, which I used to use for my Turbo Pascal code, oddly enough. :) (Freemacs was one of two popular editors BBS coders used to use, the other one was a shareware program called QEdit). And some of the widely circulated versions of The Jargon File; I’m not sure when Eric took it over, but the first version I read was maybe about a decade before The New Hacker’s Dictionary was published, which I actually thought was bogus at first, but I subsequently bought it at Border’s around 1998 or so, anyway, because I figured it might become a cool collector’s item some day. :)

  39. Well, I left programming behind long ago for administrative tasks, but I can tell you that NOT understanding pointers is kinda like learning to drive without knowing anything about how your car works. It’s not impossible, but it’s a severe handicap for which there is very little excuse. It’s critical tool that well pays for the brief study necessary to use it.

    In fact a good understanding of pointer behavior and debugging has allowed me to help a number of software vendors fix bugs over the years, long after I exited writing original code.

    As for Dijkstra, Jessica Boxer is exactly correct.

  40. Dan, Jessica: Feh. Computer science is no more about computers than thermodynamics is about engines.

  41. # Jeff Read Says:
    > Dan, Jessica: Feh. Computer science is no more about
    > computers than thermodynamics is about engines.

    Why waste a good argument when a sound bite will do.

  42. @morgan – What are you trying to say now? Isn’t that the exact line I quoted? What’s your point?

  43. OK, I’m now starting to feel a bit like the sorcerer’s apprentice standing knee-deep in… let’s call it “water”. The fact is, I’m pretty confident that I actually do understand pointers, just not as a result of anything I’ve written in Python. Figuring out the BSD-socket protocol XMMS and its clients use taught me that what I was having trouble with was not the concept of pointers, but their C syntax.

    My original comment was deliberately misleading on this point, and I now regret my puckish sense of mischief. Thank you to Jeff Bonwick and Morgan for trying to help me: hopefully some Python-and-only-Pythonist will stumble on your accounts some time and be guided closer to the bare metal as I was.

    @Jeff Read: I am at least an Associate Corresponding Knight of the Lambda Calculus, thanks to my formal linguistics training. With any luck it’ll stand me in good stead when I get on to Lisp.

  44. You don’t read too good, do ya Jeff?

    Missed the joke. Thermodynamics is, in a manner of speaking, all about engines, as abstract systems of conversion between heat and mechanical work.

    What you and Jessica say is true, in the abstract: computer science is all about computers considered as abstract systems which transform symbolic information according to a finite set of rules.

  45. @Dan: Yes, yes you did. Guess I missed it somehow when you quoted rob. Anyway, my point was that I think that Jeff Read was being pejorative. OTOH, maybe the woosh was mine, and you were just returning the favor.

  46. >I’ve heard all this “you don’t need to know low-level stuff to be a good programmer” before, and it’s almost always been a smoke screen for suckiness.

    I’ve heard all this “you absolutely need to know low-level stuff to be a good programmer” before, and it’s almost always been a smokescreen for old-fart syndrome. I refuse to succumb.

    i’m dubious. referring back to discussion in a previous comment thread, musicians who know what scales ARE — how they fit together, how they overlay and are overlaid by chords, which ones work as transitions over and through different progressions and turnarounds — are almost invariably superior to the guys who just know that major sounds happy and minor sounds sad, but can play them REALLY FAST.

    similarly, in my graphic arts education, i was taught the very basics by a group of instructors who were longtime printers moving into the digital age. they insisted that fundamentalssuch as halftone screening, offset lithography, ideation and concept development formed the basis of understanding design and production, and we were taught these things in the language of analog so that we’d understand what we were trying to accomplish later with the software. it worked, too — every day, i encounter “designers” who need to be familiar with these concepts but are not.

    is there any field in which a low-level understanding of the plumbing doesn’t help you understand what’s going on at higher levels? i’m not a programmer, but i had always assumed that this endeavor would not be an exception.

  47. > is there any field in which a low-level understanding of the plumbing doesn’t help you understand what’s going on at higher levels?

    Well, yes, to a point. A computer programmer does not need to know how a transistor works. A violinist does not need to understand the cellular structure of wood. I think Eric is saying that a programmer does not need to understand how pointers work in C, or Pascal, or Assembly. This is like saying a musician does not need to know how to tune a harp. Dan is trying to say a programmer does need to understand how memory is laid out and what a reference is. This is like saying a musician does need to understand the concept of ‘in tune’.

    My analogies are, of course, horribly flawed. But at least they were rapidly implemented!

    Yours,
    Tom

  48. Last year I did a test. A friend, a junior-year CS student, had just told me on our LUG’s chat room that he’d aced what I knew to be a very grueling compilers course. I wrote back to him, “Nice! I dub thee hacker.”.

    I had a CS prof in college in like the second day of class declare to my embarrassment, “You’re a hacker aren’t you.” He then launched quickly into a distinction between the term as he meant it and the common pop-cultural usage, mainly for the benefit of the rest of the class. Receiving the sobriquet from a professor of the art was something of a high compliment, one I have striven to live up to since.

  49. @Jeff : Missed the joke.

    Oof. Fair play. Went right over my head. :)

    I humbly retract my snark.

  50. My analogies are, of course, horribly flawed.

    Actually Tom, I thought they were rather sharp. *rimshot*

    I’m here all week, try the veal ;)

  51. I had a CS prof in college in like the second day of class declare to my embarrassment, “You’re a hacker aren’t you.”

    I married the woman that so dubbed me. I figure that’s as good as it gets ;)

  52. >I think Eric is saying that a programmer does not need to understand how pointers work in C, or Pascal, or Assembly. This is like saying a musician does not need to know how to tune a harp. Dan is trying to say a programmer does need to understand how memory is laid out and what a reference is. This is like saying a musician does need to understand the concept of ‘in tune’.

    I’ll say this: If you’re going to work in a static fixed-extent language (and especially if you’re going to work in C) I do think it is extremely, to be able to model the program’s data space in memory as a byte-adressible array and reason about layout and addresses and indexes. So I agree with your interpretation of what Dan said, but I’m not sure he actually intended that.

  53. So I agree with your interpretation of what Dan said, but I’m not sure he actually intended that.

    He caught my drift just fine.

  54. >Computer Science is about computation (generally speaking, anything that accomplishes this can be referred to as a “computer” – hence Dijkstra being full of shit)

    Revealing your immense ignorance here, and misinterpreting Dijkstra in any case. It must be embarrassing for you to reflexively spout nonsense about things you don’t understand.

  55. I, too, have received many emails that confirmed what an amazing guy I am. Sometimes I wonder whether I’m being played, but then I remember that I am, in fact, amazing.

  56. Revealing your immense ignorance here, and misinterpreting Dijkstra in any case. It must be embarrassing for you to reflexively spout nonsense about things you don’t understand.

    Do you not think the Dijkstra is full of shit? I do understand what Dijkstra is saying: he’s saying that computer science is about writing, reading, and understanding computer algorithms (programs, even) and not really about computers at all — and I still think he’s full of shit, even though most computer science professors would agree with, and even teach, Dijkstra’s statement. Think about this: without computers, we wouldn’t have computer science. Why?

  57. Yeah, I become aware of hackerdom when I was 12-14 years old as well, but what’s interesting to me is that I became an anarcho-capitalist independently of ESR.

    What I didn’t realize that all the stuff he written about open source theory was influenced by Austrian economic. I was just getting started reading Austrian economics and libertarian political theory.

    Made me realize that all the geeks surrounding mises.org and the #mises channel on freenode were years late in their discovery. ESR got there first years before the rest of us! But the new Austro-hackers and geeks were young. About 20-18 years old. We’re just starting to come out of high school.

    Eric Raymond is a prologue of things to come. Don’t be surprised when new generation of hackers start voicing individualism anarchist political viewpoint in ever increasing numbers.

    (The question is…why so many hackers or at least programming-adept are driven to anarcho-capitalism)

  58. >Do you not think the Dijkstra is full of shit?

    Because “full of shit” implies there isn’t a any truth in what he says. Writing programs following a testing regime on a computer (as opposed to a strict deductive process followed in the abstract) is the most practical way to construct real systems. However, in the case of black-box testing it is not ‘science’. The take away point here seems to be that a computer is a means of implementing abstractions that exist independently of it. In Dijkstra’s time these abstractions were the main concern for computer scientists. Nowadays there is a lot of systems research going on under the banner of computer science, the rigor of which varies wildly. Writing a program and claiming that it “works” solely through black-box testing is not scientific in the least, since a program can contain any virtually any kind of discrete behavior. That doesn’t mean it’s not useful; researchers have been trying to reap the benefits of formal methods for years with fairly slow progress. However, this fact does not promote intuitive guesswork to the level of science.

    >I do understand what Dijkstra is saying: he’s saying that computer science is about writing, reading, and understanding computer algorithms (programs, even) and not really about computers at all — and I still think he’s full of shit, even though most computer science professors would agree with, and even teach, Dijkstra’s statement.

    Most computer science that attempts to treat the subject empirically is atrocious and not truly reproducable due to the ‘worse is better’ construction of computers that Dijkstra was so against. A lot of computer science professors would disagree with Dijkstra, being that his views were so extreme. Research students often complain that decades of informal program development disproves Dijkstra’s attitude in its entirey. For practical program construction, I would agree. However, I ask those same people if they can prove that the programs that underpin their research actually works. The answer is a consistent “no”. That doesn’t mean they’re doing bad research, but they cannot claim that they are doing actual science. If anything, pointing such things out is becoming increasingly heretical in computer science classrooms.

    >Think about this: without computers, we wouldn’t have computer science. Why?

    Plenty of nascent computer science was developed independently of any practical method of computation. Computers have accelerated the progress of computer science through automation and given it an entirely new relevance in building real systems. That does not change the underlying properties of programs, though it does suggest presentations that appeal to a mechanical or operational intuition. Hence the popularity of Turing machines over the equivalent lambda calculus that preceded it. Dijkstra’s concern seems to be rigor, not presentation.

  59. Roger Phillips Says:
    > Writing a program and claiming that it “works” solely
    > through black-box testing is not scientific in the least,

    Lots of science takes place on a black box basis. Until recently, nearly all medicine, for example, was conducted on an “I don’t know why this works but it does,” and even today, that is a large part of medicine. To be scientific is to use the scientific method which very much follows the concept of black box testing.

    My experience of many computer science academics is that they like to pretend they are mathematicians. The truth is that the vast majority of their customers (that is to say students) look at a computer science degree as purely vocational. Formal methods only have any relevance at all in a tiny fraction of real world software development. For the most part the hardest part of software development is getting informal requirements never mind formal ones.

  60. >Lots of science takes place on a black box basis. Until recently, nearly all medicine, for example, was conducted on an “I don’t know why this works but it does,” and even today, that is a large part of medicine

    Just because something looks kind of scientific or you can make some kind of plausible-looking comparison to some other area of science is not good enough. There are very specific criteria that have to be met for an experiment to be valid. The kinds of black-box arguments you’re alluding to are based on certain assumptions about how nature operates, and these are the basis on which statistically arguments are made. I’m not aware of anyone making a convincing argument that these assumptions (e.g. about the statistical distribution of results) are applicable to computer programs. If you know think this is true, then you have an award-winning research project on your hands. In any case, medicine is an area that is fraught with results that have been later proven false. This is comparatively rare in mathematics or rigorous computer science, precisely because of the rigor involved.

    >My experience of many computer science academics is that they like to pretend they are mathematicians.

    Many computer science academics are mathematicians, having moved over from mathematics research. Most are simply using the tools of mathematics. My experience of many computer science academics is that they share a point of view not dissimilar to your own.

    >The truth is that the vast majority of their customers (that is to say students) look at a computer science degree as purely vocational

    Vocational use of computers is great, but it is not science. The issue that needs correcting here is that professors are serving the wrong customers. 95% of students should be going to vocational institutions staffed by actual programmers, and being made to construct real systems over and over along with learning any relevant background theory. I feel sorry for my students; not because of their teachers, but rather because the university happily takes their money without providing a proper education. It also saddens me that as a result of trying to accommodate these students we are trading rigor for populism in our classes.

  61. > If you can’t wrap your head around pointers you’re destined to be a shit monkey-ass cubicle fuckwit.

    Aka a Java/php/ cubicle-dweller, churning out the web-equivalent of TPS reports.

    > I had a CS prof in college in like the second day of class declare to my embarrassment, “You’re a hacker aren’t you.”

    I had a CS prof who, on the sixth day of class, asked me, “you’re just here for fun, right?” Because I was smoking the class.

    Later, we talked parsers. (He’s world-renowed.)

    My take is that esr knows only a bit more about programming than he does about, say, LORAN or AIS. (See recent discussions on AIS and debugging on this very blog.)

  62. > Once you understand that all of memory is like one giant array, indexed by address,

    Someone is going to have his mind expanded beyond the flat memory model when he runs (headlong) into memory spaces and address translation.

    Or even segmentation.

  63. >My take is that esr knows only a bit more about programming than he does about, say, LORAN or AIS. (See recent discussions on AIS and debugging on this very blog.)

    Have you taken over goddinpotty’s random shit-flinging? Suggestion: you’ll look a lot less foolish making claims like this when you publish a production-quality AIS decoder in open source. Good luck writing one without, er, using this.

  64. # Roger Phillips Says:
    > There are very specific criteria that have to be met for
    > an experiment to be valid.

    That isn’t true at all. Science is a very broad area of knowledge ranging from hard physics to social science, and everything in between. What constitutes an experiment, and whether experiments are even a fundamental part of that science, is very different in different parts of science. For example, paleontology has completely different expectations in regards to experimentation than organic chemistry does. Nonetheless, on a most fundamental level black box testing goes like this: I have a theory of what this program should do (based on the specification), I devise a method to see if the program does what I expect (test case.) I test it, and based on the results (test execution), I derive a new understanding of what the program does (enhance the specification with a bug report.) That sounds like a book definition of both black box testing and the scientific method.

    > In any case, medicine is an area that is fraught with results
    > that have been later proven false. This is comparatively rare
    > in mathematics or rigorous computer science, precisely
    > because of the rigor involved.

    Right, but nearly all sciences are fraught with the same problems. I am sure you are aware of some of the mistaken theories of physics too. But perhaps you think physics isn’t science either. In a sense one might argue that mathematics isn’t science since if does not engage in the scientific method of experimentation. However, I think it is not more pedantic to demand that a science necessarily use the scientific method than it is to demand a science meets some narrow definition that you seem to have (though don’t seem to explicitly state.)

    > I feel sorry for my students; not because of their teachers,
    > but rather because the university happily takes their money
    > without providing a proper education. It also saddens me that
    > as a result of trying to accommodate these students we are
    > trading rigor for populism in our classes.

    I find the arrogance of this statement breathtaking. You are mad at the University for taking money from the students and then not providing them a proper education, yet you are the educator! It is you who is at fault, not the University. The University pays you a salary to educate the students who’s money they take in the way they advertise their courses, and you have decided to give them something they haven’t asked for. Perhaps you disagree with the way the University advertises your services. You have three choices, convince them to change, get a new job, or sulk about it, but do what you are told. The fault lies at your feet and those of your fellow faculty. How depressing that you are saddened that you have to compromise your principles to give students what they have paid for! Only in academia would such insanity pass for a good argument.

  65. >That isn’t true at all. Science is a very broad area of knowledge ranging from hard physics to social science, and everything in between. What constitutes an experiment, and whether experiments are even a fundamental part of that science, is very different in different parts of science. For example, paleontology has completely different expectations in regards to experimentation than organic chemistry does. Nonetheless, on a most fundamental level black box testing goes like this: I have a theory of what this program should do (based on the specification), I devise a method to see if the program does what I expect (test case.) I test it, and based on the results (test execution), I derive a new understanding of what the program does (enhance the specification with a bug report.) That sounds like a book definition of both black box testing and the scientific method.

    Tell me, how is the error in your tests distributed? If you can’t answer this, your argument doesn’t work. It’s sad that we have to defend established science that is highly predictive to second-raters who know just enough to pollute society with their ignorance. Also, specificity does not imply that methods cannot be drawn from a broad set; it refers to methods being definite.

    >Right, but nearly all sciences are fraught with the same problems. I am sure you are aware of some of the mistaken theories of physics too. But perhaps you think physics isn’t science either. In a sense one might argue that mathematics isn’t science since if does not engage in the scientific method of experimentation. However, I think it is not more pedantic to demand that a science necessarily use the scientific method than it is to demand a science meets some narrow definition that you seem to have (though don’t seem to explicitly state.)

    Physics is an always has been more predictive than medicine, precisely because of the level of rigor in their experimental methods. In any case, I’m not going to be drawn into a protracted argument about the merits of medicine. Your mistake here is to try to conflate as many things as possible and use some kind of “appeal to category” that shows your method is scientific; no sale. The error in your tests has not been defined, and so your method cannot argue for even the probability of correctness. The only thing you can ascertain through your method is that your program satisfies whatever finite set of inputs you’ve actually tested.

    >I find the arrogance of this statement breathtaking. You are mad at the University for taking money from the students and then not providing them a proper education, yet you are the educator! It is you who is at fault, not the University. The University pays you a salary to educate the students who’s money they take in the way they advertise their courses, and you have decided to give them something they haven’t asked for. Perhaps you disagree with the way the University advertises your services. You have three choices, convince them to change, get a new job, or sulk about it, but do what you are told. The fault lies at your feet and those of your fellow faculty. How depressing that you are saddened that you have to compromise your principles to give students what they have paid for! Only in academia would such insanity pass for a good argument.

    Many students think because they are paying they automatically have the right to pass. By your argument, I should dumb the material down until everyone can pass, since most are paying for a piece of paper that they think will get them a job. The truth is we have to defend the value of our degrees for those who are able to graduate, and we have to defend science from people like you who know just enough to confuse people, but not enough to actually do any real science. If you don’t think science is worth defending, well, you’re an idiot.

  66. # Roger Phillips Says:
    > Many students think because they are paying they automatically
    > have the right to pass. By your argument, I should dumb the
    > material down until everyone can pass,

    I’m going to take a pass on this thread, however, let me point out one thing to you professor. The fact is that anyone who actually hires the kids you train will tell you the same story. Kids coming out of college with their Computer Science degrees simply can’t write computer programs. I don’t mean they can’t deal with large and complex projects, I mean they can’t do the most basic things, often they don’t even know where to start. So I don’t know if you are dumbing down the material. I don’t know if you are protecting the science. Frankly I don’t know what you are doing, but the fact is that these kids parents pay big bucks to send their kids to school to learn how to be computer programmers, according to the promises of the Universities. You academics are not fulfilling that promise. In fact, it is so bad it is verging on fraud.

    And let me assure you of this: these kids shortcomings have nothing whatsoever to do with their lack of grounding in formal methods.

  67. >The fact is that anyone who actually hires the kids you train will tell you the same story. Kids coming out of college with their Computer Science degrees simply can’t write computer programs. I don’t mean they can’t deal with large and complex projects, I mean they can’t do the most basic things, often they don’t even know where to start.

    Absolutely. This is a combination of mismanagement on the part of the university and bad academics. The university punishes us if our pass rates are too low, but send us throngs of students who lack talent and motivation. Given that professors either (a) don’t care, or (b) are already doing their best, the only thing left to move is the curriculum. Regardless of talent, the best students show an interest in, if not their work, then some other kind of technical or intellectual project. Traditionally, this has been the majority of students. Nowadays you’re lucky to get one or two out of a class of thirty. You’re never going to make a good programmer out of someone who doesn’t have any desire to learn anything but the bare minimum.

    >Frankly I don’t know what you are doing, but the fact is that these kids parents pay big bucks to send their kids to school to learn how to be computer programmers, according to the promises of the Universities

    Well, in the courses I’m involved with we make no false promises; the curriculum is accurately described in the handbook, which students are able to read before they enrol in the degree. Of course, there are
    people running courses that do not attempt to live up to the description given in the handbook. I do what I can, but I can’t fix the whole university system. The problem is the university allows the enrolment and progression of students who simply believe they’re entitled to success because they’re paying for instruction. Studying is hard, there are no easy answers, and your blame-the-academics attitude is truly at the bottom of the intellectual barrel.

    >You academics are not fulfilling that promise. In fact, it is so bad it is verging on fraud.

    Your irrational dislike of academics is embarrassing, particular in light of the fact that you seem ignorant of how the university system operates. For a start, course outcomes are typically made available to students before enrolment. The structure of courses typically does not vary a great deal over the course of a 3 year degree. Of course, there are courses that don’t teach the outcomes they advertise; this is mere incompetence/laziness of the kind that is also present outside of academia. Academics are, by and large, doing their best in a constrained system that is coping with student loads it was never designed for. To avoid future embarrassment, you may wish to actually collect some of the facts before attacking other people, rather than basing your argument solely on your childish dislike of academics.

    >And let me assure you of this: these kids shortcomings have nothing whatsoever to do with their lack of grounding in formal methods.

    Nobody said it did. I’m quite happy for students to learn systems building; you just keep missing this point over and over in your desperate frenzy of anti-academic sentiment. My sole point in this thread has been that systems building is not the same thing as science. People who want to learn systems building should be taught to build systems, with computer science as part of the background theory. People who want to learn computer science should learn computer science. You seem insistent that because most people want to learn systems building we should just freely conflate it with actual science, which has much more rigorous standards of truth.

  68. Well, I think part of this latest spate of yelling past each other could be solved with a little seperation of concerns.

    Computer science is formal and mathematical and belongs in the mathematics department with relatively few students and few professors leading to relatively few jobs without a PhD.

    Software engineering belongs in the engineering department and is concerned with practical software construction with many more students and professors leading to relatively many jobs with a BS.

    So computer science is to software engineering as physics is to electrical engineering.

    I’m glad to hear an academic make the claim that too many people are seeking university degrees to get a job. I agree. We would be better off with fewer people at universities and more people at trade schools. If we are going to subsidize univeristy education (which is looking like a worse idea all the time) we should also subsidize degrees from MIT. That’s MacGruder Institute of Trucking, natch.

    Yours,
    Tom

  69. > Have you taken over goddinpotty’s random shit-flinging?

    No.

    > Suggestion: you’ll look a lot less foolish making claims like this when you publish a production-quality AIS decoder in open source.

    I don’t need to. There are several I can already use, including Schwehr’s, which, yes, I know, references your documentation now, but the first two versions were written *from the actual* standards, not your re-writing of same.

    > Good luck writing one without, er, using this.

    Eric… notice how you typically run for the role of “all things documentation” when challenged on the programming front?

    Did I say you didn’t know much about writing documentation? No. In fact I think your writing is above par.

    But back to the subject at hand, here is what I said: “esr knows only a bit more about programming than he does about, say, LORAN or AIS.”

    Which could be interpreted favorably, had I not then pointed to recent failures on your part to understand even the simplest details of these, and how you were dead-nuts wrong about your debugging post with Jay “I dress like the Tron Guy” Maynard.

    Your turn.

  70. >Eric… notice how you typically run for the role of “all things documentation” when challenged on the programming front?

    Only in your dreams. Among other things, GPSD includes the most capable and best-tested AIS decoder to be found anywhere in open source. You mention Kurt Schwehr; his research group is now using it for that reason. Neither his Python tools nor anything else available handles the entire range of AIS sentences, and it has become apparent from conversations with three other decoder authors that none of them has even put together a regression-test load as good as mine. I code to exceptionally high standards of quality, something Coverity has actually shown objectively. Have you been the lead on a project that showed only 2 Coverity defects per 22,000 LLOC?

  71. Usually I’d be against these sorts of personal attacks, but Eric kind of puts himself up for it when he goes on about how great he is. I think Raymond’s a smart guy, and that when he sits down to write a program he’s capable of doing it pretty well. However, in his writing his claims are sloppy as typified by the debugging thread, and thoroughly extinguish any claims he might have to the title of an expert programmer.

  72. Jake:

    with Jay “I dress like the Tron Guy” Maynard.

    I dress like the Tron Guy because I am the Tron Guy. Eric and I go back much farther than either of our fame, however.

  73. Roger Phillips Says:
    > The university punishes us if our pass rates are too low, but send us throngs
    > of students who lack talent and motivation.

    I am confused. You claim to be defending the quality of your degrees, yet in this paragraph you essentially say that the quality of your degrees has gone to hell, and you have largely given up doing anything about it. You are worried about the precise definition of “science” in “Computer Science”, yet you accept that your are passing students who can’t code fizz buzz? That sounds like fiddling while Rome burns.

    > Well, in the courses I’m involved with we make no false promises;

    See here’s the thing: first of all it is admirable that you publish your curriculum. However, if one could interpret it sufficiently to know what it meant beforehand one would not need the degree. High school graduates want two things: an education from a good school and a career. Many want to go into the field of computer programming, and so naturally they go to the best school they can go to, and major in the computing degree. However, you and your mathematically oriented friends have played a shell game on them. Your definition of “Computer Science” does not correspond with their expectation. And it is not like they can take a major in most schools in “systems building”, I bet your school doesn’t offer such a course. Most non technical schools don’t.

    Change your school to offer a degree in “Theoretical Computer Science”, and one in “Computer Systems Development”. I assure you the latter will be over subscribed, the former not so much.

    > Your irrational dislike of academics is embarrassing,

    I don’t have an intrinsic dislike of academics. I have a disdain for a certain section of computer science academia simply because I have to deal with the results of their failures every day. Much of what is going on makes one wonder what they are trying to achieve. Although you reject it, the fact is that computer science is looked on by most entrants as a vocational training in computer programming. That is certainly what the graduates I deal with thought they were buying. In a sense, it is this very disagreement that leads to my aforementioned disdain.

    The fact is that the majority of academics I have dealt with have vanishingly little experience in actually building software systems. The blind leading the blind indeed.

  74. >I am confused. You claim to be defending the quality of your degrees, yet in this paragraph you essentially say that the quality of your degrees has gone to hell, and you have largely given up doing anything about it.

    Um, right. You don’t know anything about my career, nor what I am doing to improve the quality of our degrees. Let’s save you from further embarrassment and leave this silly claim aside.

    >You are worried about the precise definition of “science” in “Computer Science”, yet you accept that your are passing students who can’t code fizz buzz? That sounds like fiddling while Rome burns.

    There is no conflict between being against the teaching of cargo cult science (which is precisely what you’re advocating) and believing that the system is broken. Again, you accuse me of idly doing nothing when in fact you don’t know anything about my day-to-day activities within academia.

    >See here’s the thing: first of all it is admirable that you publish your curriculum. However, if one could interpret it sufficiently to know what it meant beforehand one would not need the degree.

    This doesn’t wash; academics are required to make themselves available to give advice on degrees. That means if you’re not sure what computer science is, you can come and talk to a professor about what it entails. These sessions often take several hours for a single student. Students are free to switch degrees midway through if they find science isn’t what they thought it was. There is simply no excuse for thinking university is going to be a 3 year ASP.NET course. When I was trying to get into university I hated maths and spent all my time writing C programs. The professor I saw about it made it quite clear to me that there was going to be much more to university than programming. He even waived the grade requirements I hadn’t met after I handed him a 1-inch stack of printed code.

    >High school graduates want two things: an education from a good school and a career. Many want to go into the field of computer programming, and so naturally they go to the best school they can go to, and major in the computing degree.

    Naturally, they don’t bother investigating what they’re committing 3 years to and later complain that it’s not what they expected. This pattern of laziness often repeats over the course of their degree.

    >However, you and your mathematically oriented friends have played a shell game on them. Your definition of “Computer Science” does not correspond with their expectation. And it is not like they can take a major in most schools in “systems building”, I bet your school doesn’t offer such a course. Most non technical schools don’t

    The only ‘shell game’ being committed here is being played by the university administration. Academics do not conspire to have larger class sizes for no extra pay, and to have students who aren’t interested in what they’re teaching. The fact that you would even suggest that academics are trying to mislead students just reveals your ignorance (like pretty much every other statement you’ve made on this topic). Universities are subsidized by public funds, and so I tink we should offer the course you describe. I’ve said this repeatedly in this thread, but you would rather keep trying desperately to pin the blame for your problems on some phantom group of academics.

    >I don’t have an intrinsic dislike of academics. I have a disdain for a certain section of computer science academia simply because I have to deal with the results of their failures every day.

    What ‘certain section’ is this? You speak as though there’s some identifiable cabal of academics who are spoiling our graduates. Most of these people have been around since at least the 1980′s, when the people enrolling actually wanted to understand the fundamentals of the field they were working within. They did not make the decision to accept vocational students into the course, and many of them do not have time to be experts in Java programming because they are expected to deliver scientific research at the same time. Now we have the tragically embarrassing situation of academics trying to play the part of a programmer, an act that students are not dumb enough to buy.

    >Much of what is going on makes one wonder what they are trying to achieve.

    This sentence is so nebulous as to mean nothing. Are you referring to research or teaching? Which aspects of the curriculum. It’s not remotely surprising to me that someone who is not versed in the field doesn’t appreciate its value.

    >Although you reject it, the fact is that computer science is looked on by most entrants as a vocational training in computer programming. That is certainly what the graduates I deal with thought they were buying. In a sense, it is this very disagreement that leads to my aforementioned disdain.

    The reason students look upon it this way is they don’t bother reading what the course is about. Sounds like a case of personal responsibility to me. You simply choose to blame ‘academics’ for a problem that is systemic; that’s your own ignorance.

    >The fact is that the majority of academics I have dealt with have vanishingly little experience in actually building software systems. The blind leading the blind indeed.

    A computer science academic’s job is neither to build actual software systems, nor to teach it. You might as well complain that a theoretical physicists can’t fix your Volvo.

  75. Roger,

    > However, in his writing his claims are sloppy as typified by the debugging thread, and thoroughly extinguish any claims he might have to the title of an expert programmer.

    Gee, if I go by this method Biden’s political mistakes thoroughly extinguish any claims he might have to the title of an expert politician. As silly as he often is though, and mistaken as he often is, Biden is an expert politician.

    But if you want to choose that sort of logic, Roger, I guess you’ll have to go with this thoroughly extinguishing any claims you might have to the title of an expert internet debater.

    Too bad. I thought you were actually holding your own pretty well is this debate.

    Also too bad that you are Jessica ignored the distinction between Computer Science and Software Engineering I gave above. Guess I am not an expert in internet debate diplomcay either. Phooey. I would rather my company hire no computer scientists and plenty of software engineers. And I’m really looking forward to the day when computer scientists are able to add formal provability to the software engineering playbook so that say, 40% of our code can be easily proven correct. That would be a big help.

    Yours,
    Tom

  76. > I am the Tron Guy

    No, you’re not. You’re a guy with a costume that has some EL Wire, and you’ve appeared on Jimmy Kimmel’s show.

    This is the Tron Guy: http://johnkennethmuir.files.wordpress.com/2009/12/tron2.jpg

    > Eric and I go back much farther than either of our fame, however.

    And yet, you and I have possibly known each other longer than you and ESR have. I call 1986.
    (I got four words for ya, Jay. “Texas UUCP Map Project”.)

    > [...] in his writing his claims are sloppy as typified by the debugging thread, and thoroughly extinguish any claims he might have to the title of an expert programmer.

    Er… Roger, Roger…. though I think what we’re really seeing here is the Dunning-Kruger Effect.

    See also: http://steve-yegge.blogspot.com/2008/06/done-and-gets-things-smart.html

  77. Okkay, Jake, I’ll give you that one, sorta: the picture is of Tron, not the Tron Guy. (True story: I was at an autograph show with Cindy Morgan (who’s still got it, 28 years after TRON!), and Bruce Boxleitner was at the next table. He walked in, saw me, and said, “You’re not Tron!” All three of us broke up laughing. He’s a super nice guy.)

    Hm. Texas UUCP Map? Your name doesn’t ring a bell, and 1986 is entirely possible – as that’s about when I first started playing with Microport System V on a 10 MHz 286. Wow. I’m glad that system’s gone. Which system were you on?

  78. # Roger Phillips Says:
    > Um, right. You don’t know anything about my career,

    I know what you have told me in your messages here. I think it is you who should be embarrassed by your frank admission that you are sending totally unprepared students out to humiliate themselves when they come work for me. However, you seem to console yourself with the belief that it is I not you who has the wrong expectations.

    However, the fundamental difference is that you think “computer science” means “the theory of the operation of computers and computation”, and I think it means “how to build successful software systems.” Frankly, I think 90% of the parents and students are going to agree with me rather than you, and since you are supposed to serve them, since they pay your salary, I think your priorities are wrong.

    Once again, all I can say is that the students I see coming out of college with degrees in computer science are woefully ill prepared to actually write software.

    > You speak as though there’s some identifiable cabal of academics
    > who are spoiling our graduates.

    What I think is that academic computer scientists fall broadly into two groups. Those that believe the purpose of a computing science degree is as you do, and those that think it is an education in building quality software systems. The quality of a computer science graduate is roughly proportional to the influence of the latter, and roughly inversely proportional to the influence of the former.

    > and many of them do not have time to be experts in Java programming
    > because they are expected to deliver scientific research at the same time.

    This could almost be a bumper sticker of what is wrong here. I once worked with a post doc physics student who worked in electron microscopy. He was an expert in plumbing together parts to make hard vacuums to prepare his samples for his research. Apparently the academics you refer to don’t have time to learn the most basic tools for use in computer programming. Frankly, it takes my breath away.

    > A computer science academic’s job is neither to build actual software
    > systems, nor to teach it. You might as well complain that a theoretical
    > physicists can’t fix your Volvo.

    Yes, and this statement illustrates the very essence of the problem with modern computer science degrees. Nobody expects theoretical physicists to fix Volvos, everyone expects computer science graduates to be able to write programs. Both are reasonable viewpoints in my opinion.

    However, we can talk over each other for another year. The fundamental problem here, as Tom has pointed out, is that we fundamentally disagree on the purpose of a computer science degree. As I have said above, my view almost certainly corresponds to 90% of parents and students, it certainly corresponds with 100% of the graduates I have talked to. But you are entitled to your view, however far outside the mainstream it might be.

  79. Jessica, your comment really is of wider import than just the difference between CS students’ and their professors’ views of just what a university CS department is about. Fundamentally, it’s a problem with the academic mindset. Academics think their work is supremely important, and should be pursued to the exclusion of all else. They disdain more practical education as “trade school”, and think their goals are and should me more lofty than that. Where they go wrong is in thinking that that’s what society truly needs.

    Academics know nothing better than how to produce more academics. That’s what they do in academia. Unfortunately, the world doesn’t need floods of academics. It needs people who know how to get their hands dirty, in reality or symbolically.

  80. >However, the fundamental difference is that you think “computer science” means “the theory of the operation of computers and computation”, and I think it means “how to build successful software systems.”

    Jessica, I think his is a defensible position. We might all be better served if everyone recognized a clearer distinction between computer science and software engineering, the latter being a better description of “how to build successful software systems.” There is a place in the world for both (interconnected) disciplines; the problem arises when people think they’re signing on for engineering and get science, or vice-versa.

  81. esr Says:
    > There is a place in the world for both (interconnected) disciplines; the
    > problem arises when people think they’re signing on for engineering
    > and get science, or vice-versa.

    I accept the difference. However, the problem is broader than that. It is the fact that good quality colleges don’t offer both. It is part of a rather pompous attitude on the part of colleges that don’t have the word “technical” in their name. Every college offers practical, vocational courses in, for example, medicine. Imagine our doctors were sent out as ill prepared as our computer scientists are? One would never consider it acceptable if a college only had courses in the theory of electronics, without some soldering being involved. One would think it laughable that a college offered a course in architecture that did not involve designing buildings. If the professors of that course complained they were too busy with their “research” to actually know anything about bricks and slate, mortar and glass, they would be laughed to derision. Yet that is, in parallel, exactly what Professor Roger is claiming.

    Some things have to be taught theoretically and practically in parallel. The theory in isolationism is self indulgence. The idea that a putative expert in computer science would disdain learning an actual programming language as our professor seems to advocate is a way of thinking so alien to me, I can’t get my brain around it.

    Sure I’m an expert in astronomy, I am just to busy theorizing to look at actual stars.

  82. > think they’re signing on for engineering and get science, or vice-versa

    Nobody’s getting science no matter what they think they’re signing up for. No matter what side of the discipline you’re on, Computer Science is a misnomer, because with few exceptions, nothing remotely resembling the scientific method takes place. The practical side can pass as engineering, though Paul Graham makes a good point when he argues that it’s really more similar to architecture than engineering. The theoretical side is just pure mathematics and there’s no reason to call it anything else.

  83. Jake Fischer,

    That article by Yegge may be the most freaking cool thing I have read in ten years. Possibly not that long, possibly longer, since my memory is nowhere near as good as his.

    Eric,

    I really would like to hear your thoughts on what Yegge has written.

    Yours,
    Tom

    ESR says: Link, please?

  84. Jessica,

    It took me awhile, since I went down the wrong path at first, but I think Professor Phillips does have a defensible position, provided we divide Computer Theory (Science or Mathematics, I’m not going to argue from ignorance here) from Software Construction (Architecture or Engineering, I’m not going to argue either). Consider a professor of physics teaching the principles of aerodynamics to a B.S level student. He might teach how to build a simple glider. He does not teach how the 737 was designed. That professor won’t teach such a thing to a graduate level student either. However, a professor of Aeronautical Engineering may very well teach a student how the 737 was designed. Java is the equivalent of a 737. It is a large, sophisticated language designed for real world applications. It is not at all designed for studying computational theory. Lisp or ML or Joy seem to be designed more for that application.

    Frankly if I were trying to learn theory, I wouldn’t want to study most real world computer languages. They are all too large and too complex. I would want to study small languages organized around one or two principles. Later, when I wanted to apply the theory I might work with someone who is good at software construction to bring my ideas into fruition within a larger language. It’s just like physicists who don’t design airplanes and chemists who don’t design chemical plants.

    The analogy is probably flawed, but at least it was rapidly implemented on the second iteration.

    Yours,
    Tom

  85. Tom DeGisi Says:
    > It took me awhile, since I went down the wrong path at first, but I think Professor Phillips does have a defensible position,

    See my previous comment. Your point is largely the same as Eric’s and my response is largely the same.

  86. >See also: http://steve-yegge.blogspot.com/2008/06/done-and-gets-things-smart.html

    Steve Yegge speaks much wisdom. Heh. The stuff about incompetent people having difficulty recognizing skill in others was especially on point.

    But I don’t think the problem Yegge is pointing at is nearly as difficult as he supposes. Not in programming, anyway, because we can use open-source projects as a “gets stuff done” demonstration that’s pretty much irrefutable because it’s both objective and auditable. The last dolt to accuse me of incompetence crawled back into his hole when I pointed out that I lead a project with a measured Coverity defect rate of 2 in 22,000 LLOC (2007). We have lots of other good proxies for “gets stuff done”. Having crucial code in every almost browser in the world, for example; any former libgif and libpng developer can claim that one. Having code accepted into the Linux kernel, and I’m guessing I’m not the only one here who makes that nut. Having code in the Python libraries. Having code in half the world’s GPS-equipped smartphones is one anybody on the GPSD project can chalk up…and these are just the ones that are easy for me to think of because I’ve been there.

    Actually, I’d say that anyone who’s founded and run a successful open-source project engaging three or more developers is genuinely a star in Yegge’s terms. Yes, we can measure “success” objectively: “shipped with Ubuntu and Fedora” will do. Doing this takes management and communications skills as well as coding ability, even if the project lead refuses to think of it as “management”. I think that kind of breadth of skills is an important predictor even in a non-management job.

    As to his question about how you recognize who’s smarter than you when you’re hiring…at least in programming, that’s easy. Is his software portfolio broader and more impressive than yours? Did he do that work where you can look at it to check? OK, this isn’t a perfect proxy for “smarts”, it confounds years of experience and other things in there. On the other hand. it probably measures the quality you actually want.

  87. > See my previous comment. Your point is largely the same as Eric’s and my response is largely the same.

    Then my analogy didn’t get it’s job done. Do you really think Java is a good language for studing compational theory?

    Eric,

    What you are talking about is the equivalent of an artist’s portfolio, and yes those are darn helpful when available. Even a non-expert can pick an artist/author/band/ad agency based on liking their work.

    Yours,
    Tom

  88. Tom DeGisi Says:
    > Then my analogy didn’t get it’s job done. Do you really think Java is a good language for studing compational theory?

    I think it is probably as good as any other procedural language. However, that really isn’t the point is it? The point is there is a lot more to computer science/engineering than computational theory. I don’t think Java is a good language for writing device drivers, and I don’t think ML is a good language for writing Web sites. But I think students in any computer science/engineering major should learn all three of the above. My objection to the Professor’s statement was the derisive dismissal that his fellow academics should have to learn an actual programming language, especially a yucky procedural one. And certainly that he should not have to have a deep familiarity of all the peculiarities of it. Heaven forbid!

  89. > Do you really think Java is a good language for studing compational theory?

    Anyone who thinks this is living in a state of sin.

    As does anyone who thinks that Java is a good ‘teaching language’.

    Java was originally designed for embedded systems, but then the goal posts were moved, and it became a language tuned to writing large software projects with (very) large teams.

    Java is (quite) literally aimed at being the VM/CMS of its day.

  90. > Steve Yegge speaks much wisdom. Heh. The stuff about incompetent people having difficulty recognizing skill in
    >others was especially on point.

    Hmm, I think you didn’t read critically.

    The Dunning-Kruger effect states:
    - Incompetent individuals tend to overestimate their own level of skill.
    - Incompetent individuals fail to recognize genuine skill in others.
    - Incompetent individuals fail to recognize the extremity of their inadequacy.
    - If they can be trained to substantially improve their own skill level, these individuals can recognize and acknowledge their own previous lack of skill.

    The converse of these is also true:
    - Competent individuals tend to underrestimate their own level of skill.
    - Competent individuals recognize genuine skill in others.
    - Competent individuals recognize the extremity of their inadequacy.

    Its an invitation for all to look in the mirror. You, me, Jessica, Jay, Tom, Daniel, etc.

    The short version is, “If you think you’re an A-lister, you’re probably not.”, or as Bertrand Russell said, “The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt.”

  91. > I don’t think Java is a good language for writing device drivers, and I don’t think ML is a good
    > language for writing Web sites.

    OK, I think we all ‘get’ why Java isn’t a good language for writing device drivers (its programming model makes access to the hardware quite difficult.), but why isn’t ML good for writing Web sites?

    ML is an impure functional language, unlike Haskell, so side-effects are at least possible. There are even web frameworks (such as: Ex-Nunc and Ocsigen )

  92. Jake Fischer Says:
    > but why isn’t ML good for writing Web sites?

    Because there are more important things about writing a software application than the nature of the language used to code it. Two obvious ones being a strong, broad and deep software architecture in support of the application, and a strong community to support the development. The fact is that the vast majority of work in software development revolves around the following activities:

    1. Looking stuff up in the API documentation (and figuring out how it works with little tests)
    2. Finding out what the heck the customer wants
    3. Thinking about how to organize the code rightly
    4. Debugging
    5. Testing and fixing bugs.

    Some might argue that 4 & 5 are easier in some languages than others. That is probably true, but less than you might think. Of at least as equal important to the nature of the language itself is the quality of the debugging support tools. In my experience most non trivial bugs are bugs in the understanding of the specification or careless inattention to particular control flow paths. (Or data flow paths in non procedural languages.)

  93. Jake,

    > The point is there is a lot more to computer science/engineering than computational theory.

    That’s your point. I disagree, because I am making a distinction between computational theory (Professor Phillips’s Computer Science) and software construction (your Computer Science). If universities made the same distinction Professor Phillips could teach and research as he wishes (if he could find a job in a much smaller but still useful field), and you could hire reasonably competent software constructors who will have become journeyman programmers in the most widespread computer language for their sub-specialty at the time (COBOL / Assembly / RPG, etc once, Java / C / SQL, etc now).

    > Its an invitation for all to look in the mirror. You, me, Jessica, Jay, Tom, Daniel, etc.

    I’m not a DGTS. Not close. I used to think I was good, but I think I gave that up at least ten years ago. I don’t think I’ve even worked with a DGTS. If Steve Yegge is right then you can’t be sure whether or not any of us are a DGTS unless you have worked with us. But if Eric is right you can look at someone’s portfolio of work and tell whether that person is a DGTS. I haven’t looked at anybodies portfolio of work. Have you? Has Steve?

    Yours,
    Tom

  94. Bad formatting above. First section to Jessica, second to Jake, apologies to all trying to understand what I wrote.

  95. Tom,

    s/anybodies/anybody’s/

    My point is that its unlikely that anyone who claims ‘rock star’ status, is, indeed, a rock star. Moreover, its completely understandable why this happens (and how).

    Steve hires people, as do I. I don’t know about Steve, but I have learned to deeply question claims of authorship, even on open source projects, but especially outside open source projects.

    This, of course, is a problem. There is only so much you’re going to learn during the interview process about the level of involvement, and in these litigious times, former managers and co-workers are unlikely to ‘out’ someone who didn’t contribute during a reference check.

    Steve partially covers this:

    All too often I find myself on interview loops where the candidate knows a seemingly astounding amount about coding, computer science, software engineering, and general industry topics, but we find out at the last minute that they can’t code Hello, World in any language.

    and

    As far as identifying good people goes, the best solution I’ve ever seen was at Geoworks, where you were required to do a six-month internship before you could get hired full-time.

    (As an aside, I was once ‘hired’ by GeoWorks (as a consultant) to ‘explain’ Java to them.)

    I commonly ask unknown candidates to write several simple functions in the language of their choice, on the whiteboard. Typically one is “delete a node from a linked list”. Extra points if they immediately ask if the list is singly-linked or doubly-linked.

    Another is, “you’re handed an array of values, move all the zero values to one end of the array”. You might be surprised how many people fail at this.

    I may or may not be DGTS, probably not. But I have repeatedly hired the same small group of DGTS-ers, and been successful doing so. DGTS is like p0rn, I guess. I know it when I see it.

    I’ll also add that managing (true) ‘rock stars’ is an art unto itself, especially when it comes to running interference for them with the rest of the organization.

  96. > Another is, “you’re handed an array of values, move all the zero values to one end of the array”. You might be surprised how many people fail at this.

    Do you require that the non-zero values stay in the same order? ;)

    Yours,
    Tom

  97. Jake Fischer Says:
    > Another is, “you’re handed an array of values, move all the zero values to one end of the array”.

    void moveToStart(int a[], size_t size) { memset(a, 0, size * sizeof(int));}

    Seems to meet the spec. Do I get the job?

  98. >Another is, “you’re handed an array of values, move all the zero values to one end of the array”. You might be surprised how many people fail at this.

    The correct answer is: “I call qsort(3)”.

    It’s the correct answer because it (a) does the job, (b) doesn’t require writing fragile code, and most importantly (c) if you tell me I’m wrong, I get to point out that you didn’t constrain it to be order-preserving on the nonzero values. Specification FAIL. :-)

  99. #!/usr/bin/perl

    # inspired by ESR.

    use strict;

    my @numbers = ( 23, 6, 0, 23, 7, 0 );

    @numbers = sort @numbers;

    # note: normally I would look all sorts of stuff up to write this. i believe in reference books.

  100. esr Says:
    > The correct answer is: “I call qsort(3)”.

    Not wishing to be pedantic, but this is wrong. If the original array contains a mix of positive and negative numbers this does not meet the specification.

    My answer is both correct and useless.

    ESR says: Hah! You fell straight into my *second* cunning trap! Who said my comparison function had to be less-than?

  101. Jessica,

    Not to be pedantic, but it depends on the comparison function he coded! See below. My solution, however, was wrong.

    void qsort(void *base, size_t nel, size_t width, int
    (*compar)(const void *, const void *));

    DESCRIPTION
    The qsort() function is an implementation of the quick-sort
    algorithm. It sorts a table of data in place. The contents
    of the table are sorted in ascending order according to the
    user-supplied comparison function.

    Yours,
    Tom

  102. int zero_to_front(const void *a_ptr, const void *b_ptr)
    {
    int a = (int) *a_ptr;
    int b = (int) *b_ptr;

    if (a == 0)
    {
    if (b == 0)
    {
    return 0;
    }
    else
    {
    return -1;
    }
    }
    else if (b == 0)
    {
    return 1;
    }
    return 0;
    }

  103. Tom DeGisi Says:
    > it depends on the comparison function he coded!

    I bow to the superior level of your abuse the the library. However, let me just point out that the performace of my solution is considerably better than yours in all cases both the theorectical performance and the practical performace. You are O(n log n) with a much slower inner loop than my very tight inner loop with O(n). Notwithstanding the lack of performance requirements in the original.

    I think your optimization that the spec does not require the algorithm to retain the order of the non zero components is less valuable than my observation that the spec does not require the algorithm to retain the values of the non zero components.

    Lets do the other one shall we?

    > delete a node from a linked list”

    I propose:

    template
    void DeleteNode(list l, list::iterator p)
    {
    l.erase(p);
    }

    Do I get the job now?

  104. Those who responded with ‘sort()’ or ‘qsort(3)’ fail for a couple
    reasons. The most important reason is that qsort() is, at best,
    O(n log n), while the above is O(n), (like Tom’s solution).

    When I was presented with this problem (by Rob Kolstad) during an
    interview (at USENIX, in Phoenix, June 1987), I asked for clarification,
    “You want it sorted?” The response, “No, just move the zeros.”

    Answering ‘sort’ was failure.

    Once I finished, I was asked for the run-time, so I had to know ‘Big-O’, too.

  105. Here is one solution.

    void
    move_zeros(int *vector, int size)
    {
    int *index, *fnz; /* fnz = first non-zero */
    index = fnz = vector;
    while (index < (vector+size)) {
    *index ? index++ : (*index++ = *fnz, *fnz++ = 0);
    }
    }

  106. Well crap, I’m wrong. qsort() has an average run time of O(n log n). Its best case is O(n), its worst case is that quicksort runs in quadratic time O(n^2).

    But calling sort() or qsort() for this problem is still failure.

  107. I had to change Tom’s zeros_to_front() to:

    int
    zero_to_front(const int *a, const int *b)
    {
    if (*a == 0) {
    if (*b == 0) {
    return 0;
    } else {
    return -1;
    }
    } else if (*b == 0) {
    return 1;
    }
    return 0;
    }

    and this avoids the multiple returns:

    int
    z(const int *a, const int *b)
    {
    int n = 0;
    if (*a == 0) {
    if (*b == 0) {
    n = 0;
    } else {
    n = -1;
    }
    } else if (*b == 0) {
    n = 1;
    }
    return n;
    }

  108. Some preliminary testing shows that moving_zeros() is over twice as fast as calling qsort() with the indicated function with “gcc -O”

  109. Jake Fischer Says:
    > Those who responded with ’sort()’ or ‘qsort(3)’ fail

    Sorry, the bug was in your spec, not the code. Your spec did not specify a performance requirement, not did it require preservation of the order (or value) of the non zero values. You might think this is implied, however, there are other perfectly reasonable implications that might be drawn, including the one Eric mentioned explicitly — a low probability of bugs. The sort of solution your offered with lots of pointer arithmetic and swaps is exactly the sort of code that commonly has subtle bugs that are hard to find.

  110. # Jake Fischer Says:
    > “gcc -O”

    Hey, doesn’t the -O flag to gcc mean “put bugs in my code”? :-)

  111. >The sort of solution your offered with lots of pointer arithmetic and swaps is exactly the sort of code that commonly has subtle bugs that are hard to find.

    Performance-challenged but easy to verify beats the crap out of fast but potentially buggy for one very simple reason: machine time continually gets cheaper, while programmer time continually gets more expensive.

  112. esr Says:
    > Performance-challenged but easy to verify beats the crap out of fast but potentially buggy

    You can’t make that statement in general. It is often true, but, as with so much it depends. Linear searches of unsorted lists are generally much easier to verify than hash tables with complex secondary hashing schemes and insert reorders. But the former is often not the best choice.

  113. > Linear searches of unsorted lists are generally much easier to verify than hash tables with complex secondary hashing schemes and insert reorders. But the former is often not the best choice.

    If linear searches of unsorted lists were always better, Oracle would not have had the $$$ to buy Sun.

    I wonder where Professor Phillips went?

    Yours,
    Tom

  114. Tom DeGisi Says:
    > If linear searches of unsorted lists were always better, Oracle would not have had the $$$ to buy Sun.

    I said easier to verify not “always better.” (That is true using the word “verify” in both a formal and informal sense.)

  115. Jessica,

    You said “But the former is often not the best choice,” and I was trying to agree with you.

    Yours,
    Tom

  116. Tom DeGisi Says:
    > You said “But the former is often not the best choice,” and I was trying to agree with you.

    Well in future, agree with me more vehemently!!! :-)

  117. >I accept the difference. However, the problem is broader than that. It is the fact that good quality colleges don’t offer both. It is part of a rather pompous attitude on the part of colleges that don’t have the word “technical” in their name. Every college offers practical, vocational courses in, for example, medicine. Imagine our doctors were sent out as ill prepared as our computer scientists are?
    One would never consider it acceptable if a college only had courses in the theory of electronics, without some soldering being involved. One would think it laughable that a college offered a course in architecture that did not involve designing buildings. If the professors of that course complained they were too busy with their “research” to actually know anything about bricks and slate, mortar and glass, they would be laughed to derision. Yet that is, in parallel, exactly what Professor Roger is claiming.

    No, I am claiming that a computer science academic doesn’t need to be an expert in the latest industry fad. Industry languages tend to have complete APIs, but in terms of language features they usually lag behind PL research language by decades. It’s both entertaining and tragic that practitioners don’t realise where many of the language features they take for granted originate. Your analogy works against you in any case; an EE academic would not be expected as a rule to be an expert in every corner of industry practice, only enough to get his job done.

    >Some things have to be taught theoretically and practically in parallel. The theory in isolationism is self indulgence.

    This is pure ignorance. Are you aware of the impact that pure mathematics (which is done essentially in isolation) has had on pretty much every science in existence? This is just more populist, anti-science nonsense that says that industry practitioners should decide what’s good science. Again, nobody has suggested that computer scientists cannot program (if you can’t quote me saying this you ought to apologise); merely that what passes for good practice in software engineering (or whatever you care to call it), is not science. You’re going to actually have to put up an argument that holds up to that end or I’m going to start ignoring you.

    >The idea that a putative expert in computer science would disdain learning an actual programming language as our professor seems to advocate is a way of thinking so alien to me, I can’t get my brain around it.

    Quote me where that I ‘advocate’ not learning an actual programming language, or please apologise for putting words in my mouth. I love learning new languages; it’s one of the joys of the field. That does not mean I have to think I’m doing ‘science’ when I go and write a program in a new language.

    >Sure I’m an expert in astronomy, I am just to busy theorizing to look at actual stars.

    If there was a way to reason about the stars that could be verified with mathematical rigor on paper (as is the case with computer programs), then this would be completely acceptable. How many of your strawmen have to be immediately shot down before you give up on this ludicrous position?

  118. >If there was a way to reason about the stars that could be verified with mathematical rigor on paper (as is the case with computer programs), then this would be completely acceptable. How many of your strawmen have to be immediately shot down before you give up on this ludicrous position?

    I think that, regardless of mathematical proofs, it behooves academic computer scientists to test their theories rigorously on actual, current hardware, if only to discover flaws in the computing environment. I seem to recall a quote from someone (perhaps Knuth?) regarding programs in a heavily-theoretical comp.sci. course/book, on order of: “Beware of using these programs in real applications; I have only proved them correct, not tried them.”

  119. >I think that, regardless of mathematical proofs, it behooves academic computer scientists to test their theories rigorously on actual, current hardware, if only to discover flaws in the computing environment. I seem to recall a quote from someone (perhaps Knuth?) regarding programs in a heavily-theoretical comp.sci. course/book, on order of: “Beware of using these programs in real applications; I have only proved them correct, not tried them.”

    That depends upon the nature of the theory. If we’re talking about the efficiency of a program then sure, we may need to test the program on actual hardware. For theories that are part of the toolkit of computer science (e.g. programming languages), we expect an actual implementation so that people can decide on its usefulness through practice. However, there is no reason, for example, that the Scott model of computation needs to be ‘tested’ against modern hardware, since it has nothing to do with program efficiency or in fact execution on a machine. These theories are ultimately measured by their ability to be corroborated by and to form other theories, and are only related to practice through a thick morass of indirection. This is probably why people unfamiliar with the field dismiss the theoretical aspects; they do not know where many of their everyday tools come from. Sometimes practice follows theory, and sometimes theory follows practice.

  120. Roger,

    I really look forward to being able to add formal specifications to my code and have the compiler partially verify it, perhaps with some hints from me. Lots of the code I write is working with such simple business and design rules the compiler ought to be able to verify it. Then we would only mess up on the hard things – like making sure we had actually added all the formal specifications we needed.

    Yours,
    Tom

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>