Obviously, UR is not a programming blog. And in a post that warms up with a 75-mile-long blockquote about Hegel, I didn't really think of myself as writing for a technical audience. Technical audiences are not to be underrated, however, and I've noticed that a lot of UR readers are in this category. So I thought I'd say a few more words about CS research.

This is not a subject that interests all. And if it doesn't interest you, no one can conceivably require you to read about it. And I recommend you just skip this post.

First, the Reddit comment thread raised various criticisms which I didn't see in time to refute. Let me start by answering two of these points, and sneakily segue into what I think is wrong with CS research.

One: Guy Steele is a system software designer, not a PL researcher. In other words, he is in a class with Dennis Ritchie, Alan Kay, Brendan Eich, John McCarthy, John Warnock, John Ousterhout, Bjarne Stroustrup, Rob Pike, Larry Wall, Ted Codd, Tim Berners-Lee, Leslie Lamport, Ken Thompson, Dave Cutler, Sergey Brin, Luis von Ahn, Guido van Rossum, Linus Torvalds, and anyone else who has designed fundamental architectural components of code which everyone on earth points their CPU at a zillion times a day. Frankly, these men are heroes. They are literally warriors of God. And anyone who insults them is an asshole.

I'm sure some of the above individuals - perhaps even most - were, at some time in their long and productive careers, funded by various grants or other sweetheart deals with the State. For that matter, I'm sure few if any of them would endorse the extreme opinions I express below. But if anyone with a forehead steeper than a halfpipe has ever described their work as, for example, "grant-savvy," I am a Cape buffalo.

So here's the first thing that's wrong with CS research: there's no such thing as CS research. First, there is no such thing as "computer science." Except for a few performance tests and the occasional usability study, nothing any CS researcher does has anything to do with the Scientific Method. Second, there is no such thing as "research." Any activity which is not obviously productive can be described as "research." The word is entirely meaningless. All just semantics, of course, but it's hardly a good sign that even the name is fraudulent.

When we look at what "CS researchers" actually do, we see three kinds of people. We can describe them roughly as creative programmers, mathematicians, and bureaucrats.

Creative programmers write interesting, cool, and relevant software. The only workable system for generating interesting, cool, and relevant software is well-known. Find a bunch of really smart programmers and point them at a large problem space for which there are actual users, and for which new solutions are unconstrained by old designs. Give them a manager who's just as smart and knows how and when to stay out of their way, and turn them loose.

Depending on the people and the problem, this approach may or may not produce results. But certainly nothing else will. More or less the above strategy was followed at the MIT AI Lab, at Bell Labs in the early Unix days, at Engelbart's lab, at Xerox PARC, at Berkeley CSRG, etc. It produced most of the aforementioned pioneers of system software.

And it is the farthest possible thing from academic CS research as practiced today, which I think is the main reason why we see so little good come out of the field.

Of course, creative programmers can be hard to inhibit. Academic CS programs do bring together a lot of very smart people, and sometimes they still get out of control and actually build something useful. Thus, for example, Google. Note that the idea that became Google was not a part of anyone's research project, it was not assigned by Page and Brin's advisors, it had no Principal Investigator, it was just interesting, cool and relevant software.

As a general rule, this sort of thing can only happen in the first couple years of grad school, in which your basic purpose in life is to learn all the things they forgot to teach you as an undergrad. After that you are sucked into the apparat, and unless you are very good at working the system, your power to work on random cool stuff disappears. If you are extremely lucky and successful, it may reappear in fifteen years, when you have your own empire. But most creative people don't have the patience to play this game.

The problem is the funding. The reason why CS research produces so little that can be called creative programming these days is that the modern process of grant-funded research is fundamentally incompatible with the task of writing interesting, cool and relevant software. Rather, its goal is to produce publications and careers, and it's very good at that. As we'll see when we get to the bureaucrats.

But because of this problem, most creative programming these days comes from free-software programmers working in their spare time. For example, the most interesting new software projects I know of are revision control systems, such as darcs, Monotone, Mercurial, etc. As far as Washington knows, this problem doesn't even exist. And yet the field has developed wonderfully.

It's very difficult for creative programmers in the academic CS world to compete with those in the free-software world. Academics have one advantage: money. Free-software programmers have another: freedom. Ideally one would have both, but if you have to pick, pick freedom. If you look at the salary of a grad student or a postdoc, it's not that hard to support yourself at the same standard of living by working intermittently in the corporate salt mines. Besides, you might actually learn something.

Next we have the mathematicians, who prove interesting, cool, and relevant propositions. Unfortunately, most of the really interesting, cool, and relevant propositions in computational mathematics were proved before 1960, but there is still some fun stuff left. Genuine computational mathematics typically goes under the name "algorithms" in CS, although cryptography is also of course math.

Obviously, computational mathematics and creative programming are only barely related. In my humble opinion, if something is math, it should be in the math department. As we'll see, managing math and programming as if they were one field has produced disastrous results.

This brings us to the third group, the bureaucrats. Bureaucrats build academic empires which churn out meaningless solutions to irrelevant problems.

The CS-research bureaucrat's main difficulty is that no one wants to fund bureaucrats. Therefore, he must pretend to be either a creative programmer or a mathematician, preferably both. Since this task is critical to his survival, he is extremely good at it.

The bureaucrat has many strategies. But probably his best is to take an area of creative programming and devour it like a locust, by turning it into a form of mathematics.

Math outcompetes creative programming in the funding process, simply because it appears to be more rigorous. It is more rigorous, and it generates a longer, deeper river of more impressive publications. And, because its area is nominally applied, it doesn't have to compete with the real mathematicians over in "algorithms," who would clean the bureaucrats' clocks in five minutes.

The problem with math is that there's an infinite supply of it. It is always possible to create new problems to solve and new formalisms to apply. Math is always interesting and cool, at least to mathematicians, and after your field has been parasitized by mathematicians for a decade or two, everyone in it will be a mathematician. There's enough work for everyone.

It's possible to describe anything in mathematical notation. I recall seeing some paper once in which someone had created a mathematical description of C. (I forget whether or not this included the preprocessor.) As an achievement, this is somewhat like building a full-size model of the Eiffel Tower out of tongue depressors. It's clearly not the act of a talentless man, but you have to wonder what he said when he applied for his grant.

Whatever their tactics, what CS bureaucrats always sacrifice is relevance. Of course everyone has a conscience, and everyone would like to be actually relevant. But, especially when the only people checking up are your own godfathers in the funding agencies, it's much easier to pretend to be relevant. Actual relevance is extremely difficult to achieve, and hardly rewarding at all. In fact it's embarrassing, because everyone who isn't relevant and knows it has an automatic grudge against you. Since CS research is quite competitive, evolution has its way, and relevance goes the way of the snake's legs.When the responsibility of relevance has been lifted, it's easy to write as many interesting and cool papers as you like. The point of these papers is to prove that you, the researcher, are smart. Of course, not only would the world be a much better place if a smart person such as yourself was working on something relevant, but you yourself would be having more fun. But this is the trap.

No field has been more infested by irrelevant formalisms than that of programming languages - also known as "PL research." So when I say Guy Steele isn't a PL researcher, what I mean is that he's not a bureaucrat. Rather, he's a creative programmer who writes interesting, cool, and relevant software, which happens to consist of programming languages.

The only way to understand the horrific trainwreck that is PL research is to actually look, in detail, at the ways it's discarded relevance in favor of irrelevance. To that end, let me answer another of the Reddit readers' complaints.

So, two: it was perhaps a little light-hearted of me to describe proof-carrying code as the world's most pointless compression scheme. But the argument is basically accurate.

The whole idea of proof-carrying code is that it's a binary format for executable code whose correctness can be automatically verified. The term cannot imply a source format, because a source format whose correctness can be automatically verified is best known as a "type-safe programming language."

Such a binary format is useful because it saves CPU cycles across the entire network. If the source format can be verified but the binary can't - a trivial, and generally universal, property of anything anyone could describe as a "compiler" - obviously, you cannot ensure correctness unless you send the source rather than the binary. This requires you to perform the same compilation step on every machine for every piece of code it runs. An obvious, and obviously massive, source of global inefficiency.

Unfortunately for the researchers working on this problem, now and for the foreseeable future, the cost of client-side compilation is quite moot. It may have mattered at a time when computers were much slower. In fact, I will go so far as to say it probably did matter, say, as recently as 1990. However, with modern incremental compilation it is not even worth considering. Everyone who browses the web is compiling code from source, with every click. What is HTML? What is Javascript? Not chopped liver. Source-based systems have won, because they are simply simpler - they pass what Rohit Khare calls the "telnet test" - and they are easily fast enough on any modern machine.

If you can check the source but you can't check the binary, it's probably better to just send the source. If the binary is smaller than the source, a naive compression algorithm should do pretty well, too. If you like the fact that the binary is opaque and hard to decompile, it's not at all hard to write a shrouder (automatic code obfuscator) that achieves the same goals. If you want to support multiple source languages, pick one which covers the entire feature space of the binary verifier, and compile the others to it instead. If all this fails and you really need secure binaries, use a cryptographic signing service. (People who really care might enjoy this amusing discussion of "The Future of PCC" from 2000.)

Because the price of PCC or anything like it is inevitably a file format whose definition is a 80-page LaTeX paper, including many strange, squiggly marks which for the average coder might as well be Sumerian cuneiform. There is a reason why IETF RFCs are ASCII-only, and at least the good ones are quite short. Therefore, the chance that PCC or any design involving it will ever be approvable by any standards process not involving a caoutchouc-based engraved ink applicator is, to put it mildly, remote. In standards, complexity is death.

Therefore, because the entire goal of a network protocol is to be standardized, PCC cannot possibly achieve its own goal. And therefore, every CS researcher working on verification algorithms for generated code is wasting time at public expense.

There is a name for this. The name is patronage, and most historians consider it a criminal abuse of government power. CS research is only a tiny brick in the great pyramid of academic patronage that is the university and educational system, and yes - if you didn't, someone else would. But if you only steal a candybar, you're still a thief.

And this is what I think is wrong with CS research: it's best understood as a massive patronage scheme. Compared to all the other wholesale patronage operations run by our benign, caring masters, the financial cost of this particular scheme is relatively small. However, its human and economic cost is much higher, because it sucks in many young, talented people who could otherwise be engaged in productive work.

Again, any unproductive activity can be described as "research." There is no endeavor so obviously noble that its value to others cannot be evaluated. Nor is there any endeavor whose toilers will happily report to you that they're wasting their time, and their funding should be cut. There is no substitute for actual critical thinking.

If you feel the point is made, please feel free to skip to the end of the post. But if you think PCC may be an exception and you're looking for more examples, by all means, let's continue.

Again, the general problem in PL research is that it's been drowned in clouds of math, whose effect is not to create better languages, but to publish more papers. Specifically, PL research today is actually the study of something called "type theory," whose correspondence to what a naive person might consider research into programming languages - designing new languages for actual users to actually use - is extremely remote.

Type theory actually has nothing to do with computers or computing. It is the modern development of the project in metamathematics (the expression of mathematical statements in mathematical terms) that originated in the late 19th century and continued into the first half of the 20th, with researchers like Frege, Russell, and Church. In other words, it dates back to when "computer" was a job description. I rest my case.

You can model computing as metamathematics, of course. You can model computing as Tinkertoys. The whole point of Church-Turing equivalence is that pretty much any recursive model you can build is an equivalent description of computing. The only reason the lambda calculus, and other such metamathematical approaches (such as defining programs as proofs) are so popular in the world of "CS research" are that "CS research" was largely founded by a land-rush of metamathematicians. The motivation for this migration is left as an exercise for the reader.

Of course, in a sense, anything you do with in a computer can be described as "mathematics." The point is not whether or not programming is math. The point is what notation is most effective for expressing programs. Choosing the best notation is the entire problem of programming language design, and this problem is neither mathematical nor scientific. A programming language is a user interface for programmers, and if you can reduce UI design to math, science, or any formal process, call Apple, not me.

I happen to prefer the ASCII-based family of notations used by working programmers, which are clearly effective for encoding the transformations of state which all programs, functional or imperative, typed or unsafe, express. I don't see why anyone whose goal is to design, explain, or specify a programming language should be using any other notation than that of the language itself, and I don't see why any language needs any non-ASCII notation.

Even academic languages like Haskell and OCaml have ASCII notations, although researchers who write papers on them are still fond of their private symbol set. As a marketing strategy this approaches the genius of Crunchy Frog. Frankly, CS research is so distrusted outside its own ghetto that even posting your work as a PDF file (let alone ps.gz) is a big red flag. Break out the squiggles and it's pretty much curtains.

Anyway, if you want to learn about type theory, you can buy Types and Programming Languages, by Benjamin F. Pierce. If you are at all confused after this, you can clear up any difficulties with Advanced Topics in Types and Programming Languages, by Benjamin F. Pierce. Presumably Professor Pierce is now working on "Further Reading in Types and Programming Languages," or "Extremely Advanced Topics in Types and Programming Languages."

Each of these tomes would make a fine textbook for a graduate class, or at least upper-level undergraduate, at a top-rank American university. Certainly, anyone who can master this material is qualified to teach undergraduate programming. I'd also say they're smart enough to take any other programming job - for example, they'd make good kernel hackers. If, of course, they were fully retrained to be masters of C (though many already are).

Meanwhile, you can explain the type system of C to a fifteen-year-old in a day. And C is almost certainly the most difficult programming language in use today, except C++. (I love C, but I have never much liked C++.) It takes a decent C programmer typically a good week or two to learn basic C++, although they often emit very nasty C-isms for quite some time thereafter.

Meanwhile, you can explain the type system of Python to a retarded nine-year-old in five minutes. I exaggerate, slightly.

This perhaps explains why Python was not designed by a PL researcher. Python was not designed by a PL researcher because Python would not impress other PL researchers. And since impressing your peers is the sine qua non of any academic discipline, any academic who designed something like Python (probably the closest similar case is Ousterhout's Tcl) would be doing it simply for their own private kicks - a perverse feat of intellectual masturbation, perhaps impressing the undergrads, but hardly a source of any actual professional prestige.

It also explains why Haskell was not designed by Guido van Rossum (designer of Python). Mynheer van Rossum, who as far as I know dropped out of kindergarten, wanted to build a language that people would find useful. And he certainly did.

A programming language like Haskell, with a generally Piercean type system that takes a semester for even the smartest undergraduates to learn, is not useful. Because one of the key ingredients of victory in a language conflict - as in any other standards war - is how many people already use the language.

This conflict is unstable. It exhibits the Matthew Effect. Since a language is a UI for programmers, a language that's hard to learn has a fatal and self-reinforcing disadvantage in this contest. There's no need to learn it, because it has no chance of winning the standards war. And thus it is not a good language.

Haskell actually is quite useful - in one context. It's an excellent teaching language for advanced students in a first-rate undergraduate CS program. Learning Haskell cannot help but teach you many challenging concepts, and it is inevitable that those who are both smart and dedicated will master these concepts. The rest will not. And thus the university system performs its principal function, the assignment of rank. If you venture to suggest that the same function could be performed, at two orders of magnitude less cost, by an IQ test and three weeks at Parris Island, you are probably some kind of a fascist.

Of course, the exponents of Haskell have an answer for this. They answer that since Haskell is so more elegant and powerful than the likes of Python, it can overcome all these problems.

I am certainly a fan of pure functional programming, which Haskell offers and Python does not. In theory, pure functional programming is actually simpler than imperative programming, because the former is a subset of the latter. However, the slight advantage of removing imperative features does not even begin to make up for the Eigerlike learning curve of Haskell, whose incredible and utterly-unwarranted complexity manifests itself in more ways than I can even begin to describe.

Let me describe one of these ways by examining one of the principal features of Haskell, which is what might be called "dynamic higher-order programming."

A language has "dynamic higher-order programming" when your programs can construct new functions dynamically at runtime. If you know a little about programming, this probably sounds esoteric, and for good reason. However, Haskell uses it all the time to do just about everything.

For example, in Haskell, when you write an add function - call it add() - that adds two integers a and b, the proper and approved way to do it is to first dynamically construct a function - it will have no name, but call it add_a(x) - that adds a to some argument x. Then you call add_a(b). This is called "currying" (after the mathematician Haskell Curry).

The motivation behind this bizarre obfuscation has always escaped me. Obviously it allows each function to have only a single argument, but it is pretty easy to write an add() function whose single argument is a pair (a b) - hardly a recondite data structure.

And it's not just that dynamic higher-order programming is overkill for add(). It's overkill for anything. For example, one of the most touted uses of higher-order-programming is parser generation - as performed by systems like Parsec in Haskell.

The idea of parser generation is, unsurprisingly, to generate a parser. A parser is a function whose input is a text file and whose output is a data structure. Obviously, parsing is the first stage in any process which involves converting source code into executable code, ie, compiling. No programming language, for example, can exist without a parser.

The trick is that if you write a parser just as a normal program, it tends to be extremely messy. A parser is really best described as a data structure called a grammar, and a grammar - though it may include pieces of code - is not code at all, but its own data structure.

In most programming environments which are not language-specific, there is a separate tool (called yacc in Unix) that automatically converts a grammar into a function written in a normal language. For example, yacc converts a yacc grammar, typically a .y file, into a C program, or .c file.

Now the way yacc works is a nasty process, because it involves generating source, and as a general rule it's always nasty to generate source. The Haskell model - in which the grammar is converted directly into a function, by a normal program in a language designed to build functions - seems much prettier.

And it is. However, there is only one problem - the function we build is the same every time. A language is a language. Its syntax is not dynamic. By definition, one parser function is sufficient for any program written in the language.

Therefore, we have no need for dynamic higher-order programming. All we need is static higher-order programming. For every program, the parser generator must be run once per grammar. Granted, you might want to load grammars dynamically at runtime, but you might want to load any function dynamically at runtime. The solution to this problem is not dynamic function construction - it is dynamic module loading.

(Note that static higher-order programming is not at all inconsistent with a system of first-class functions, like function pointers in C, closures in Lisp, etc. In a language with first-class functions, you can store functions as variables in normal data structures, but this does not imply the ability to construct new functions.)

In fact, "static higher-order programming" has another name. It's a specialty of the older, and much simpler, Lisp language family. In Lisp and its many relatives, "static higher-order programs" are called macros. Unsurprisingly, your average PL researcher looks at a macro pretty much the same way your average Parisian chef looks at an Outback Steakhouse.

Even forgetting the macros, it's pretty easy to see why you don't need dynamic higher-order programming. For example, a very common operation on functions is to compose them - you have f(x) and g(x), you make h(x), defined as f(g(x)). In the right formal model, a compose operator is really no different from addition. And once you have first-class functions - which are not absolutely necessary, but certainly useful - it seems like a trivial extension.

But is it what you, the programmer, want to do? Actually, no. It is simply bad programming style. Its only effect is to make your program less comprehensible.

Because in a language with first-class functions but without dynamic higher-order programming, all you need to do is build a data structure which is the ordered pair (f(x) g(x)), and define h(x) as an operation on this structure. This may be slightly more cumbersome for the programmer. At least, if one line of code counts as "slightly more cumbersome."

But it has a big benefit, which is that you're dealing with a data structure and you know it. Strictly from the perspective of user experience, it's much easier to debug data structures than to debug dynamic code. This is also the reason why self-modifying code is a bad idea, at least from a software-engineering perspective, and the bad idea of dynamic higher-order programming can be seen as a corollary of this well-known conclusion.

Of course, it may be slightly easier to optimize the result of dynamic code generation, because you can throw a generic runtime optimizer at it. But this comes back to the first problem, which is that, in practice, we only need static code generation. Whatever problem we are solving by constructing h(x), it is probably better solved by a macro, which would perform the same composition statically.

This entire problem space comes down to a single error in the metamathematical approach to computing, which is that the 1930s metamathematicians were fascinated by the fact that they could represent any data structure as a function. While this is true, to describe it as perverse is an insult to perverts.

Surely, if you were actually building a programming environment, rather than trying to express the fundamentals of mathematics, your main concern would be how to represent code as data, rather than the other way around. (Again, this is the Lisp approach.)

Defining data as dynamic higher-order functions worked badly when most computing was standalone. And it works even worse now that we have these things called networks. The problem is that a dynamic higher-order function is a sort of ethereal construct, a speck of four-dimensional pixie dust, and the idea of saving it to disk or sending it over the network does not make any particular sense.

The few people who actually try to use the metamathematical languages for real work struggle manfully to get around this - for example, at Jane Street Capital, an OCaml shop, they use a source preprocessor to compose Lisp-style versions of their types. A thing of beauty is a joy forever. A source preprocessor is not a thing of beauty.

Okay. Let's rise slightly above this rant, and survey the wreckage. The problem, again, is that taxpayer funds are being used to employ some of the world's most brilliant and energetic people to do work of no conceivable practical utility. Perhaps it may have some serendipitous benefit, but surely if the same people were working on relevant problems they would produce much more useful results.

How can such a thing happen? How did this disastrous patronage system come to exist? Was it anyone's evil plot?

Not at all. It's just the effect of treating something that isn't a science as if it was a science. Confucius, if I may quote my namesake's teacher, said that if he were given a chance to reform the state, his first act would be to make sure all things had their proper names.

I think the world could use a charity that funds creative programming. The software systems that people use today - don't even start me on "Web 2.0" - are awful and ancient, and hardly anyone has any reasonable plan to improve them. Free-software programmers are not at all bad at supporting themselves, but nothing like Xerox PARC exists today, and it should.

But the US Government is not a charity, and creative programming is not "computer science." And the result of treating these things as if they were things that they aren't is abominable. It's the morass of busywork, waste and fraud that is CS research today. By far the simplest treatment for this mess is to just abolish it.

Because anyone who's not involved in CS research treats the products of this endeavor as if they were smallpox-infected blankets. Even when it is clearly - in my opinion - good, it winds up ignored. Because of the inescapable grant-related propaganda, it's impossible to tell what's good and what's not.

For example, recently some of the same people involved in the PL research I so dislike built a language called Cyclone, which adds some very useful safety features to C. There are still zillions of free-software projects written in C, and probably most of them could benefit from upgrading to Cyclone. But the thing has the academic kiss of death on it, and no one will touch it. The mailing list is virtually empty.

This is not just prejudice. It is rational mistrust. Academics, as we've seen, have no incentive to build software that's actually relevant, and every incentive to build software that appears to be relevant. They have every incentive to overpromote, and no incentive at all to build an actual user base. In fact, an actual user base is an enormous drag for a CS researcher, because it demands actual support, which does not advance the researcher's career at all. Also, because of the nefarious Bayh-Dole act, CS researchers are frequently armwrestled into patenting their work, which of course they have no incentive to disclose. If the rest of these factors didn't give you a reason not to use academic software, this certainly would.

The result is a world of Potemkin software which appears to be enormously useful, even revolutionary. In reality it is unusable. The researchers are some of the smartest people in the world, and surely some of what they're doing has some merit. But it is almost impossible to figure out what's wheat and what's chaff, and most sensible people just don't come near it.

For example, maybe seven years ago I was in a design meeting at a small company which was at the time the unquestioned innovation leader in its field, mobile Web browsing. (I admit that this is a pathetic field to be an "innovation leader" in, and in fact most of our "innovations" turned out to be worthless. I'm just describing the perception here, not the reality.)

The conversation turned to something and one employee, Patrick, who'd been recently poached from Nokia and didn't know the vibe, said "maybe we could research that."

Bruce, the CTO, promptly said: "if Alain [the CEO] heard you use that word, he'd rip off your head and spit down your neck."

148 Comments:

The motivation behind this bizarre obfuscation has always escaped me. Obviously it allows each function to have only a single argument, but it is pretty easy to write an add() function whose single argument is a pair (a b) - hardly a recondite data structure.

I've always found curried functions to be a rather useful piece of functionality. It's true that you can use tuples instead, but I find that they tend to reduce readability and increase verboseness.

For instance, let's assume we want a function that increments every value in a list by a certain amount, and returns the result. Without using currying, we might create something like this:

inc (n, xs) = map (\x -> x + n) xs

Using currying:

inc n = map (+ n)

To my mind the latter is both more concise, and more understandable, as it does away with superfluous noise.

Another nice function I saw recently was one that groups items in a list into a bag-like structure:

bag = map (head &&& length) . group . sort

Without currying and composition, it becomes:

bag xs = map (\g -> (head g, length g)) (group (sort xs))

Again, I prefer the curried version, as it does away with the superfluous noise that makes it harder to understand what the function does.

If you venture to suggest that the same function could be performed, at two orders of magnitude less cost, by an IQ test and three weeks at Parris Island, you are probably some kind of a fascist.

Never before in my life have I ever been happier to be called a fascist.

Meanwhile, you can explain the type system of Python to a retarded nine-year-old in five minutes. I exaggerate, slightly.

Ah, but what is clearly needed is a type system designed by that same retared nine-year-old.

Oh, and by way of reference: Now that I've beaten blogger/gmail/etc. into submission, where you saw the commenter Christopher before, you should now see Booklegger, like you were supposed to from the beginning.

Since I'm giving you grief elsewhere, let me say that as a the semi-proud holder of a graduate degree in a CS-related but not CS department, I agree with you about 80%. That is, you are completely right about a good deal of CS research, but not everything that goes on under the banner of CS is formalist symbol soup. Some people build real systems, design real algorithms, solve real problems. But they are in perpetual danger of being sucked into the undertow of boringness. Something like this seems to have happened with the Semantic Web, a good idea that has failed to take off because it's been latched onto by every half-assed logician in the Western World.

Thanks for your comment! Of course everything you say is true. Our disagreement is purely aesthetic.

From an aesthetic basis, however, I think these examples are an excellent example of how the incentives of academia led the designers of Haskell down the wrong path.

Haskell is designed to look very pretty and simple. In other words, it looks easy to learn and use. In practice, however, everyone who tries to learn it seems to find it extremely complex and challenging.

I don't think this is a coincidence. I think it's the result of the normal incentive structure of CS research. As we saw, CS researchers have strong incentives to make their work look useful, but no incentives to ensure it is actually used.

Perhaps an even better example than currying is the syntax of Haskell. Whether in ASCII or otherwise, Haskell always looks pretty on the page. For the purpose of making a pretty algorithm look pretty on paper, you really can't beat Haskell.

But if you read the Haskell Report, you realize that this is achieved by rules for - for example - significant whitespace, that make X.500 look straightforward. I suspect that most people who learn Haskell learn this rules not by reading the spec, but by cutting and pasting. I think they are too complex to sink in through anything but osmosis.

Certainly this is the style of every attempt to teach Haskell that I've ever seen. It is all done on a tutorial basis. You learn by doing. Whereas when you see a language like Python, or even a language like C, taught, ordinary programmers tend to learn from documents - K&R being the great classic - that are hardly more than annotated versions of the reference manual. If you tried to teach Haskell this way half the class would die of a brain aneurysm.

So, once you pay the steep conceptual cost of understanding currying, yes, it can make some things that would otherwise look slightly more complex, look slightly simpler. But a bit of syntactic sugar applied to tuples might work just as well. And it's certainly a lot easier for the average programmer to follow.

What really sucks is that there are features in Haskell and languages like it, like what a Lisper would call "destructuring bind" (pattern matching), that you really don't see done very well elsewhere. (There's nothing wrong with Lisp except that it's 50 years old. But this is pretty much enough.)

Again, please feel free to give me as much grief as you want. I can take it just as well as I can dish it out.

I don't think I gave the impression that everything called "CS research" is useless. "Perpetual danger" sounds about right to me.

If there was ever anything besides half-assed logicians behind the Semantic Web, it's news to me.

Perhaps the idea you mean is that the Web should be a distributed programming environment rather than just a way to deliver documents. True, but it's sort of too late to fix that. It's like expecting MS-DOS to magically morph into Unix.

If you built a global namespace from scratch you would not reuse names (no mutable resources), and the namespace would be rooted in a secure identity model. Refactoring the Web to include these points is sort of like redesigning a horse so that it's a motorcycle.

I don't think Haskell was designed to be particularly easy to use! But nor do I think that is necessarily a bad thing. You say that the designers of Haskell took the language down the wrong path; but I don't think popularity was ever their goal.

Regarding Haskell's relative complexity, I tend to agree that simple syntax is a pretty important factor for any language. However, most, if not all, of Haskell's syntactical complexities are just sugar to reduce typing. You can reduce Haskell to, if memory serves, 2 typing constructs and 3 declaration constructs. The do-notation, pattern matching, and whatever else aren't strictly needed - but they do make the code a lot easier on the eyes.

Regarding currying; in Haskell it's no more difficult in practise than partial function application in any other language, and far from the most complex thing you'll come across in Haskell.

I agree that Haskell is a tough language to get to grips with, and that it is unlikely to gain the same following that a language like Python or Java enjoys. However, I don't think that designing languages around the lowest common denominator is always the best idea. Sometimes keeping things simple is the wrong way to go.

However, a "Python-esque" functional language would be a nice thing to see :)

If you conceive Haskell as an exercise in higher mathematics, no, there is nothing wrong with it.

The problem is that it has been promoted as a programming language, and not just that but the state of the art, approved by experts, ideal programming language.

Since what most people mean by a programming language is a user interface for programmers, there is an element of spin in this, which has not the best odor when public funds are involved.

The practical result is, as mentioned, that people outside academia do not trust anything that comes out of the machine. Which is very unfortunate considering the amount of talent within it, and the fact that the products that emerge - such as Haskell - contain many useful ideas which at the very least are worth borrowing.

I, too, would like to see a Python of functional programming :-)

The trouble is that when, like the designers of Haskell, you work as if you had no complexity budget, you never really learn how simple the system can be made.

Perhaps a good FP language has to be as difficult to learn and use as Haskell is. Perhaps the complexity is necessary. Perhaps it isn't. Since it's clear that producing the Python of FP was not on the Haskell designers' minds, Haskell is hardly evidence that they tried and failed.

Yes, Haskell is promoted as a programming language (perhaps because that's what it is), but I'm not sure anyone has ever pretended that it is an easy language to get to grips with.

Haskell does have the scent of academia about it, if only because it's essentially just lambda calculus with sugar on the top, and there are a lot of concepts in the language which are rarely found outside papers on functional programming theory.

But that's precisely Haskell's strength. Haskell's complexity and relative difficulty make it an exceedingly powerful language, as you can abstract programming concepts to an extremely high degree. Removing Haskell's complexity would remove its advantage - Haskell isn't Python, and I don't think all programming languages need to emulate Python's ease of use.

FP isn't hard, but Haskell employs some rather exotic concepts that you won't often find, even in other functional languages. Removing these concepts would make Haskell easier to learn, but that would rob Haskell of the very thing that makes it stand out.

I get the impression the designers of Haskell are more interested in furthering the art programming than appealing to the masses, which is not such a bad thing. If we were always focused on ease of use, we'd miss the advantages that languages like Haskell can offer.

I don't disagree with any of these sentiments - my only problem is that I rarely find them so clearly and honestly expressed.

In practice Haskell is a great teaching language for an intensive, top-rank undergraduate programming curriculum. It stretches the brain and teases it in all kinds of interesting ways. What it is not is a good user interface for programming. But one very rarely finds it promoted in these terms. One very often sees it promoted as the language of the future. At least this is my experience.

The merit of conceptual simplicity goes far beyond the ease with which programmers who are not first-rate, or who need to learn the language fast, can learn it. It's a matter of the ease with which one coder can understand another's work. Systems that rely on concepts which are more straightforward tend to win in this category, even when the programmers are first-rate.

For example, many of the more abstruse features of C++ are counterproductive for just this reason. Often an equivalent program restricted to simpler concepts may consume more lines of code. But it is often much easier to both write and read this larger, simpler version. Typing and scanning are not the primary bottlenecks in the human process of writing and reading code, respectively.

Also, one of the tropes one sees with Haskell in specific and with FP in general is that those who demonstrate and promote it seem primarily concerned with very intricate algorithms, such as are rarely encountered in any programming task. Even in this case I am not convinced that dynamic construction of functions is ever more straightforward than static construction, for the reasons laid out in the article.

Unfortunately my view is more easily demonstrated by example than by rhetoric, which is why I should probably spend more time coding and less blogging :-)

Haskell, not a good interface for programming? I have to disagree! It may be complex and difficult to get to grips with, but then so is, for instance, Vi or EMACS. Many would argue that the benefits of these editors outweigh their relative complexity; indeed, their complexity arises from their extensive functionality, so to an extent, they are advantageous to use because of their complexity.

Haskell is not so different in this regard. All of the monads, arrows, currying and so forth aren't in there for show. They provide powerful abstractions that other languages do not have. This is important, because it means that in Haskell, you can implement solutions that are impractical, or even impossible, to implement in other languages.

Haskell is difficult because it pushes programmers toward a highly abstract way of thinking about a problem. Rather than solve the problem at hand, it encourages you to generalize your solution, to solve the problems behind the problem.

Haskell isn't perfect; but criticising it for its complexity is, I think, missing the point somewhat. Removing complexity from Haskell generally means removing capability. Haskell may or may not be the language of the future, but it is one of the most powerful programming languages in use today.

Indeed - definitely follow anon's link if you are interested in a discussion.

Weavejester - Haskell is certainly a good UI for a certain set of (extremely intelligent and well-trained) users and a certain set of (extremely intricate and algorithmic) problems.

The tragedy is that this confines FP to a tiny academic ghetto, where I'm sure both of us agree it does not belong. Haskell is a bad UI as a general-purpose functional programming language, for all the reasons stated above.

And I still think it is possible to build an easy-to-learn language which is almost as good as Haskell for the kinds of showpiece problems that Haskell tends to be demonstrated on. The proof, however, is in the pudding - so I should probably shut up and code!

I'm a wannabe language designer. I've written three articles on Haskell, but I absolutely adore Python. I've been thinking of going back to get my Ph.D so that I can try to move the industry forward. I could never figure out why programming language research had to be so dang complex or mathematized. A lot of your points matched the points I made in one of my articles:

http://www.linuxjournal.com/article/8850

especially in the "What's Up with All the Math?" section.

Thank you so much for setting me straight! Now I know that hanging out with Guido is probably more useful than trying to understand all those crazy research papers!

"van Rossum, who as far as I know dropped out of kindergarten, wanted to build a language that people would find useful"

Actually, he got an MS from univ amsterdam, worked at several research institutes for quite a while, and designed this language as a successor to the ABC language, which again, believe it or not, was designed at CWI, an academic institute.

CS research isn't designed to be immediately useful. Nor is it necessary that more than 1% of it actually pans out and affects the real world. The research community is basically many smart people going about doing what they find interesting and exploring new ideas. Some of them are smarter/luckier than others and manage to do stuff which changes the world for the good. Even then, they built upon previous research that was "impractical" or "academic".

At least it's nice to see that you yourself realize that the smart people such as Stroustrup, Wall, Brin or Torvalds would not agree with your statements.Which puts your paper in the "some bitter weltschmertz by someone who hasn't himself yet achieved much to boast about" category.

From your text one might read out that you don't like theoretical CS and Math, but there are no viable arguments that would support the idea of their economical valuelessness (especially in comparison to other disciplines). You say you find the work of MyCoolSoftdevHouseNextDoor more valuable than the work of the researchers trying to break Netflix because Python is nice and Haskell is yuckyyucky-difficult? Your logic is flawed here, make a note.

Some examples of how you don't understand PL don't prove nor even illustrate that CS and math are useless and "creative programming" is useful.

Finally, you forget that the choice to do "creative programming" and "academic career" are made by people, not by the state that funds them. It is, in fact, much easier to do creative programmer while being a grant-funded researcher than while working on the "salt mines" of commercial software development.

Thanks for your in-depth analysis - its put the nail on the head as to why I just accepted a consulting job after doing a CS PhD (mainly that I want a job that makes a direct and guaranteed difference to the world).

However, I was wondering: You say that CS 'sucks' many young people in, but you don't mention much about the alternatives available. Maybe you could write a post detailing some other jobs that you think still feel interesting? I've noticed that many academics scorn work outside, without real experience. Maybe you could show them the light?

As an ex professor in Computer Science I am sad to say that your description of CS is fairly accurate. At my department the bureaucrats had all the power and the creative programmers was departing one by one due to lack of funding.

I was fed up an Type Theory a decade a go. Not to mention process algebras.

As a Ruby fan, a disgusted Javascript practitioner, a Forth admirer, an early Smalltalk addict, a former Prolog user, a deceived C++ coder, a C nostalgic, a 8086, Z80 and 6502 optimizer, and a once language designer I must confirm that...

I disagree with your assertion that computational mathematics and practical/creative programming aren't very closely related. Recently, I've been trying to create a diff between two XML files for a program I'm working on. This is a useful thing with a semi-creative application here (creating document diffs documents without exposing the user to formatting internals). It's not an entirely new idea, and I was able to find tons of useful information in academic papers. There is some open-source software in this area, but those are mostly transcriptions of the algorithms that took so long and so much thought to develop.

It really is depressing that there is such a disconnect between grant processes and interesting/cool/useful work. I'd love to see Governments creating bodies to look for examples of cool work, as voted by communities and pass out rewards. It is nice however seeing more "spin-off" work coming out of the projects I've been working on. There seems to be more tolerance from the people above to go invent something really cool as long as it's useful within your project and it doesn't suck too much of your time. I think sometimes managers are also recognising that more publicity is good publicity, and if you happen to create a fantastic new nugget of open source goodness on your way to creating your intended goal, well, more the merrier;-)

Guy Steele may not have "Programming Language Researcher" on his business cards but I think its fair to say that a lot of his work was in fact focused in that area. He did co-create both Scheme and Java, after all.

Of course, in a sense, anything you do with in a computer can be described as "mathematics." The point is not whether or not programming is math. The point is what notation is most effective for expressing programs.

That's not fair. Programming in its purest form is math, but average programming is much less. Or in other words, our goal is to make it math.

The bigger point is that, unlike human languages where Sapir–Whorf plays a middling role, in programming languages the effect is monstrous. Notation essentially defines what you can do. And since we can't do much, I blame the notation.

I happen to prefer the ASCII-based family of notations used by working programmers, which are clearly effective for encoding the transformations of state which all programs, functional or imperative, typed or unsafe, express. I don't see why anyone whose goal is to design, explain, or specify a programming language should be using any other notation than that of the language itself, and I don't see why any language needs any non-ASCII notation.

Because without changing that, we won't get anywhere. Try to do a complex budget estimation or an accounting system in a text editor. That's ASCII notation, so what's the problem? The problem is that it's unmanageable. "Assets of Five Hundred Dollars equals Liabilities of Three Hundred plus OE of Two Hundred." I can't stand ASCII notation. (And don't get me wrong, viewing this text in a graphical form is even worse.)

> A programming language is a user interface for programmers

Currently, sure. But it shouldn't be. A programming language should be the codification of a problem set. The UI is anything you use to manage that codification. 1 + 1 as an AST is the programming language (as it should be). The UI is how you view it and change it to 1 + 2.

Just so you know that all is not lost, I had an idea for a new approach to software construction, hired grad students and worked on it non-stop for over ten years. Have no fear, people will find a way.

You seem to have misunderstood PCC. It's exactly what the name says: Proof Carrying Code. Code (source code, machine code, or some other form) that comes with a proof of some property. When you get the code you can verify (mechanically) that the proof is actually a proof of the property that it claims (e.g., never making a buffer overflow).If you do this for source code you have to trust that the compiler you then use on the source to make it executable doesn't make any mistakes that can ruin the property. If you do it on the machine code you don't have to trust the compiler, since the proof is about the executable itself.

The utility of something like parsec is that it makes it easy to parse a complex grammar precisely like, e.g., the haskell grammer, where operator precedence can be defined on-the-fly.

Furthermore, parsec doesn't have to return a boring parse-tree, but any given portion of a parser can return anything, including, for example, another parser, or a higher order function that composes them. See, e.g., Okasaki's classing (and thoroughly readable) "Even Higher-Order Functions for Parsing or Why Would Anyone Ever Want To Use a Sixth-Order Function?": http://citeseer.ist.psu.edu/163183.html

If you do this for source code you have to trust that the compiler you then use on the source to make it executable doesn't make any mistakes that can ruin the property. If you do it on the machine code you don't have to trust the compiler, since the proof is about the executable itself.

You still have to trust your CPU - after all, it translates binary into internal microcodes. You have to trust your OS, because it modified binary before loading it to memory, resolving library references/jumps/whetever is needed on particular OS/architecture. I don't understand why you assume infallibility of OS and CPU, but distrust the compiler in particular?

What about jvm bytecode? Will you trust java binary if it is proven to be ok? Is Hotspot compiler,OS, CPU or all of it?

great post. well written & argued. You nailed a lot of things I've thought or suspected about academia and particularly CS academia.

My best short description of it is a charity or country club for arrogant pretentious types from pampered upbringings who want to improve their resume while putting off having to do real work as long as possible, ideally forever. I don't think this generalization accurately describes ALL people in that space, of course. But in my experience this is the rule rather than the exception. I too have thought that there is way more innovative AND practical stuff coming out of companies, cafes, home offices, garages, etc. rather than universities. All "real" research can be done today by a guy with a brain and a computer to hack on, and some way to communicate, collaborate or share his work or ideas with others. Enter the Internet.

A language has "dynamic higher-order programming" when your programs can construct new functions dynamically at runtime. If you know a little about programming, this probably sounds esoteric, and for good reason.Actually, this is also one of the central features of Python.E.g.:

I have come to know this post via another blog (written in Japanese). First of all, I am one of what you call bureaucrats:-) and used to be a student of Benjamin Pierce, so I may be biased, but I will try to be as logical and subjective as possible in this comment. Second of all, I am not a native English speaker (nor a good writer in any language), so please forgive my bad writing. Third, many of my comments below may just be repeating similar points that are already made by somebody else, but I think it would anyway be useful to have them at one place. Fourth, I have not read other posts by you and do not know who you are, so please excuse me if I am missing any context of your post.

Now, your opinion is interesting and the topic is very important, but I am afraid there are too many logical leaps and factual errors that weaken the whole argument.

> One: Guy Steele is a system software designer, not a PL researcher. [...]

What is your definition of system software designers and PL researchers? You seem to be defining that one is a system software designer if he or she has already done something good in your opinion, and a PL researcher otherwise. That is a tautology and does not make a good argument.

> I'm sure some of the above individuals - perhaps even most - were, at some time in their long and productive careers, funded by various grants or other sweetheart deals with the State. For that matter, I'm sure few if any of them would endorse the extreme opinions I express below.

You seem to admit that few, if any, of them would agree to your opinion, but why is funding the only possible reason? They might also disagree with you for other reasons, e.g., because they think CS research is useful.

> Any activity which is not obviously productive can be described as "research."

This may or may not be true, but even if it is true, that does not imply CS research is not productive nor the name is fraudulent. ("X can be called A. Y is called A. Therefore Y is X"?) Here you seem to be starting from the assumption that CS research is fraudulent and falling into tautology again.

> "The only workable system for generating interesting, cool, and relevant software is well-known. [...]"

Do you think your heroes developed "interesting, cool and relevant software" out of thin air on their own? Just for one example, did Guy Steele invent Scheme without knowing lambda-calculus? And when was lambda-calculus studied first? This is just an example, and most good research is like that! (Or, if you believe the present CS research is worse than research at the time of Church---which may or may not be true---you need to argue for that.)

> For example, the most interesting new software projects I know of are revision control systems, such as darcs, Monotone, Mercurial, etc. [...]

Of course those projects are great, but you seem to be confusing academic research (e.g., physics) and practical development (e.g., construction). I think this is the source of most of the "problems" your are concerned with. (Or, again, if you think only the present CS research is wrong and other academic research is fine, you need evidence to support that.)

> Unfortunately, most of the really interesting, cool, and relevant propositions in computational mathematics were proved before 1960

Again, are you sure you could tell the value of those results if you lived then?

> As we'll see, managing math and programming as if they were one field has produced disastrous results. [...] I recall seeing some paper once in which someone had created a mathematical description of C. (I forget whether or not this included the preprocessor.) As an achievement, this is somewhat like building a full-size model of the Eiffel Tower out of tongue depressors.

In fact, "mathematical description of C" is far from "Eiffel Tower out of tongue depressors." The former _is_ useful (or even necessary) for formal verification of C programs and compilers. You seem to be against formal methods at all, but then you need to make more arguments why they are wrong. To me (and many other people), most software of today is too buggy, and using mathematics (or logics, to be more precise) for programming seems to be a natural way to go _in the long term_ (which is most academic research is about).

> The whole idea of proof-carrying code is that it's a binary format for executable code whose correctness can be automatically verified. The term cannot imply a source format, because a source format whose correctness can be automatically verified is best known as a "type-safe programming language."

This is a _grave_ factual error! (Please forgive my direct and explicit words, but this alone could be a sign of total ignorance of the field.) Proof carrying code is not only about type safety, nor only for binary format.

> If you want to support multiple source languages, pick one which covers the entire feature space of the binary verifier, and compile the others to it instead.

In short, the language "which covers the entire feature space of the binary verifier" is called proof carrying code.

> If all this fails and you really need secure binaries, use a cryptographic signing service.

Cryptographic signing may or may not prevent malware and viruses (depending on whether the social system works or not), but it is not effective against unintentional bugs in legitimate software (which can be exploited by the attackers). Have you indeed read "Panel: The Future of Proof-Carrying Code" (which you cited)? If you have, why did you ignore natural counter-arguments like this in your post?

> You can model computing as metamathematics, of course. You can model computing as Tinkertoys. The whole point of Church-Turing equivalence is that pretty much any recursive model you can build is an equivalent description of computing.

This is technically incorrect. Very few translations between models are fully abstract, i.e., equivalence preserving. More generally, many important properties of programs (such as their equivalence!) are not preserved by translations into Turing machines. That is one of the main reasons why we do not (in fact, cannot) study Turing machines only.

> Presumably Professor Pierce is now working on "Further Reading in Types and Programming Languages," or "Extremely Advanced Topics in Types and Programming Languages."

Just for your information, Benjamin publicly says he is tired of writing books (after writing TAPL - he only _edited_ ATTAPL) and will not write another, at least for a while.:-)

I would refrain from commenting on the rest of your post (about Haskell, Python, Cyclone, ...) because I am not a heavy user of these languages nor an enthusiastic advocate of purely functional programming. (I mainly use OCaml for both academic and non-academic programming, and I generally find it at least as useful as C.)

Now, all of these said, I share your concern on the discrepancy (or even a conflict, IMHO) between academic PL research and practical software development, and am very interested in arguments like yours. I wish if it were more logical and accurate, so that we can be more constructive and productive!

I suspect this guy is a moron and doesn't have a clue what he is talking about. However, I feel very frustrated for not being able to articulate the exact reasons of why he is a moron and how big a moron he is. Also, I didn't read that whole piece of crap.

For one thing, maybe he could try actually reading a doctoral thesis in any field of computer science before spouting bullshit about whether or not they employ the scientific method.Maybe instead of limiting the papers he reads to technical discussions abot programming languages that he's clearly not equipped to understand anyway, he could check out areas related to image processing, or data compression, where the existance of pretty tables should at least be able to get through to him that proper experimentation has been involved.

Also, Python got list comprehensions, a pretty major feature, from Haskell, thus validating the flow of ideas from research lanugages to pragmatic languages, and probably rendering most of his ranting moot.I didn't read the whole thing either.

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their localworld of warcft goldwatering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power levelingthe Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises!

The Angels confirmedwow goldSunday that they have pulled out of the bidding for freewow goldagent Mark Teixeira's services. Team spokesmanwow goldTim Mead said the club would have no furtherwow goldcomment today.The club withdrew its offer of eightwow goldyears in the $160 million range forwow goldthe 28-year-old first baseman.

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their localworld of warcft goldwatering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power levelingthe Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises!

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their localworld of warcft goldwatering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power levelingthe Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their localworld of warcraft goldwatering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power levelingthe Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises!

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their localworld of warcraft goldwatering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power levelingthe Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises!

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their localworld of warcft goldwatering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power levelingthe Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises!

As Israel’s tanks and troops poured into Gaza on Saturday, acheter des kamasthe next phase in its fierce attempt to end rocket attacks, dofus kamasa question hung over the operation:acheter des kamas can the rockets really be stopped for any length of time while a political analyst, dofus kamasin the newspaper Haaretz on Friday. “No matter what you call it,” he added, “Hamas will obtain legitimacy.”

The best kind of friend is theghdbecause you have only one life and one chance to do all kind wholesaleyou can sit on a porch swing with,wholesale electronics never say a word,and then walk away feeling like it was the best conversation you've ever had.ugg boots It's true that we don't know ugg bootswhat we've got until we lose it,wholesale ugg bootsWholesale handbags but it's also true that we don't know what we've been missing until it arrives.wholesale clothingIt takes only a minute to get a crush on someone,Wholesale jewelry an hour to like someone,wholesale clothing and a day to love someone- but it takes a lifetime to forget someone.wholesale handbags Don't go for looks; they can deceive. Don't go for wealth, even that fades away.wholesale furnitureFurniture Wholesale Go for someone who makes you smile because it takes only a smile to make a dark day seem brightWholesale jewelry.Dream what you want to dream; go where you want to go;Ceramic tile be what you want to be, because you have only one life and one chance to do all the things you want to do.Always put yourself in the other's shoes.Micro sd cards If you feel that it hurts you, it probably hurts the person too.A careless word may kindle strife;Wholesale clothing a cruel word may wreck a life; a timely word may level stress; a loving word may heal and blessWholesale Jewelry. The happiest of people don't necessarily have the best of everything they just make the most of everything that comes along their way.Love begins with a smile, grows with a kiss,Wholesale fashion jewelry ends with a tear. When you were born, you were crying and everyone around you was smiling. Wholesale costume jewelryLive your life so that when you die, you're the one smiling and everyone around you is crying.

Just for today I will try to live throughRolex WatcheswatchesI will do at least two things I don't replica watchesJewellery Watcheswant to do-just for exercise. I will not show anyone that my feelings are hurtghd this day only andghd not tackle my whole life problem at once.ugg boots I can do something for twelve hours that would appall me if I had to keep it up for a lifetime.uggsJust for today I will be happy. High pressure blowerIndustrial fanThis assumes to be true what Abraham Lincoln said,Industrial blower that "Most folks are as happy as they make up their minds to be."Just for today I will adjust myself to what is,Commercial blower and not try to adjust everything to my own desires.wholesale I will take my "luck" as it comes.Just for today I will try to strengthen my mind. china wholesaleI will study. I will learn something useful. I will not be a mental loafer. I will read something that requires effort,wholesale jewelrywholesale computers thought and concentration.wholesale christmas suppliesJust for today I will exercise my soul in three ways.I will do somebody a good turn and not get found out: If anybody knows of it,it will not count. I will do at least two things I don't want to do-just for exercise. I will not show anyone that my feelings are hurt: they may be hurt,but today I will not show it.Just for today I will be agreeable. I will look as well as I can, dress becomingly, pressure blowertalk low, act courteously, criticize not one bit, and try not to improve or regulate anybody but myselfpressure blowers.Just for today I will have a program, I may not follow it exactly, but I will have it. I will save myself from two pests: hurry and indecision.Just for today I will have a quiet half hour all by myself and relax. During this half hour, sometime,fansblowers I will try to get a better perspective of my life.wholesale shoesJust for today I will be unafraid. wholesale clothingEspecially I will not be afraid watchesto enjoy what is beautiful, and to believe that as I give to the world, so the world will give to me

My dream ended when I was born. Although I never knew it then, wholesale electronicsI just held on to something that would never come to pass. Dreams really do exist.china wholesale But in the morning when you wake up, they are remembered just as a dream. That is what happened to me.I always had the dream to dance like a beautiful ballerina twirling china electronics wholesalearound and around and hearing people applaud for me. When I was young, I would twirl around and around in the fields of wildflowers that grew in my backyard.I thought that if I twirled faster everything would disappear and I would wake up in a new place.wholesale Reality woke me up when I heard a voice saying, "I don't know why you bother trying to dance. Ballerinas are pretty, slender little girls. wholesaleBesides, you don't have the talent to even be a ballerina." I remember how those words paralyzed every feeling in my body. china wholesaleI fell to the ground and wept for hours. We lived in the country by a nearby lake. I did not like to be at home.

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their local world of warcft gold watering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power leveling the Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises!

Today, the Microsoft-owned in-game ad agency said that it has signed an exclusive multiyear agreement with Blizzard. Azerothians opposed to seeing in-game ads in their local world of warcft gold watering holes need not worry, however, because the deal is limited to Blizzard's Web sites and Battle.net,the game maker's online-gaming hub. Terms of the deal were not announced, but Massive did note that the agreement is applicable to users in the US, Canada, Europe, South Korea, and Australia.buy wow gold

Massive also said today that it would be extending its aforementioned deal with Activision to encompass an additional 18 games appearing on the Xbox 360 and PC.cheap wow goldThe agency didn't fully delineate which would fall under this deal, though it did call out Guitar Hero: World Tour, James Bond: Quantum of Solace, and Transformers: Revenge of the Fallen,buy wow items as well as games in its Tony Hawk and AMAX Racing franchises.Shortly before Activision and Vivendi announced their deal of the decade,wow power leveling the Guitar Hero publisher signed on to receive in-game advertisements from Massive Inc for a number of its Xbox 360 and PC games. A bit more than a year later, Massive is now extending its reach to Activision's new power player, Blizzard Entertainment.buy wow gold from our site ,you'll get more surprises!

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with monsters and traverse the countryside, by yourself or as a team, find challenging tasks, and go on to higher cheap wow gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and playing it is another experience altogether.[wow7gold]Even though WoW is a wow gold for sale rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game world of warcraft gold immediately. If on the other hand, you need a detailed manual, the fastgginstructions are there for you to access.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with monsters and traverse the countryside, by yourself or as a team, find challenging tasks, and go on to higher cheap wow gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and playing it is another experience altogether.[wow7gold]Even though WoW is a wow gold for sale rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game world of warcraft gold immediately. If on the other hand, you need a detailed manual, the fastgginstructions are there for you to access.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with monsters and traverse the countryside, by yourself or as a team, find challenging tasks, and go on to higher cheap wow gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and playing it is another experience altogether.Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game buy cheap world of warcraft gold immediately. If on the other hand, you need a detailed manual, the instructions are there for you to access. Buy wow gold in this site,good for you ,WoW Gold, BUY WOW GOLD.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with monsters and traverse the countryside, by yourself or as a team, find challenging tasks, and go on to higher cheap wow gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and playing it is another experience altogether.[wow7gold]Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game buy cheap world of warcraft gold immediately. If on the other hand, you need a detailed manual, the fastgginstructions are there for you to access.Buy wow gold in this site, ibgibg , k4gold and pvpsky ,WoW Gold,BUY WOW GOLD.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with Cheapest wow gold monsters and traverse the countryside, by yourself or as a buy cheap wow gold team, find challenging tasks, and go on to higher Cheap Wow Gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and cheapest wow gold playing it is another experience altogether.Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game World Of Warcraft Gold immediately. If on the other hand, you need a detailed manual, the instructions are there for you to access. Buy wow gold in this site,good for you ,WoW Gold, BUY WOW GOLD.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with Cheapest wow gold monsters and traverse the countryside, by yourself or as a buy cheap wow gold team, find challenging tasks, and go on to higher Cheap Wow Gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and cheapest wow gold playing it is another experience altogether.Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game World Of Warcraft Gold immediately. If on the other hand, you need a detailed manual, the instructions are there for you to access. Buy wow gold in this site,good for you ,WoW Gold, BUY WOW GOLD.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with monsters and traverse the countryside, by yourself or as a team, find challenging tasks, and go on to higher cheap wow gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and playing it is another experience altogether.

Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game buy cheap world of warcraft gold immediately. If on the other hand, you need a detailed manual, the instructions are there for you to access. Buy wow gold in this site,good for you ,WoW Gold, BUY WOW GOLD.

Once upon a timewow gold, an old farmer planted a plot of rice. Everyday he went to the field to watch the seedlings grow. He saw the young shoots break through the soil and wow goldgrow taller each day. But still, he thought they were growing too slowly. He got impatient with the young plants. "How could the plants grow faster?" He tossed in bed during the night and could not sleep. Suddenly he hit upon an idea. He had an idea not wait for daybreak. He jumped out of thwow golde bed and dashed to the field. By the moonlight, he began working on the rice seedlings. One by one, he pulled up the young plants by half an inch. When he finished pulling, it was already morning. Straightening his back, he said to himself, "What a wonderful idea! Look, how much taller the plants have grown one night!" With great satisfaction, he went back home. He told his son what he had done in a triumphant tone. His son was shocked. Now the sun hwow goldad risen. The young man was heart-broken to see all the pulled-up young plants dying. People now use " Ba Miao Zhu Zhang" to describe the behavior of those who are too eager to get something wow golddone only to make it worse. The idiom is a bit like the English proverb "Haste makes waste" ------to spoil things by excessive enthusiasm.

There was once a lonely girl who longed so much for love. One day while she was walking in the woods she found world of warcraft goldtwo starving songbirds. wow power levelShe took them home and put them in a small cage. She cared them with love and the birds grew strong.cheap wow gold Every morning they greeted her with a wonderful song. wow power levelingThe girl felt great love for the birds.

She lord of the rings goldnoticed the other bird moving back and forth on the edge of the cage. She could feel his great need LOTR Goldfor freedom. He needed to soar into the clear, blue sky. She lifted him from the dofus kamascage and tossed hikamas dofusm softly into the air. The bird circled once, twice, three times.

There was once a lonely girl who longed so much for love. One day while she was walking in the woods she found world of warcraft goldtwo starving songbirds. wow power levelShe took them home and put them in a small cage. She cared them with love and the birds grew strong.cheap wow gold Every morning they greeted her with a wonderful song. wow power levelingThe girl felt great love for the birds.

She lord of the rings goldnoticed the other bird moving back and forth on the edge of the cage. She could feel his great need LOTR Goldfor freedom. He needed to soar into the clear, blue sky. She lifted him from the dofus kamascage and tossed hikamas dofusm softly into the air. The bird circled once, twice, three times.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with Cheapest wow gold monsters and traverse the countryside, by yourself or as a buy cheap wow gold team, find challenging tasks, and go on to higher Cheap Wow Gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and cheapest wow gold playing it is another experience altogether.Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game World Of Warcraft Gold immediately. If on the other hand, you need a detailed manual, the instructions are there for you to access. Buy wow gold in this site,good for you ,WoW Gold, BUY WOW GOLD.

WoW shares many wow gold of its features with previously launched games. Essentially, you battle with monsters and traverse the countryside, by yourself or as a team, find challenging tasks, and go on to higher cheap wow gold levels as you gain skill and experience. In the course of your journey, you will be gaining new powers that are increased as your skill rating goes up. All the same, in terms of its features and quality, that is a ture stroy for this.WoW is far ahead of all other games of the genre the wow power leveling game undoubtedly is in a league of its own and playing it is another experience altogether.

Even though WoW is a wow gold cheap rather complicated game, the controls and interface are done in buy warhammer gold such a way that you don't feel the complexity. A good feature of the game is that it buy wow items does not put off people with lengthy manuals. The instructions cannot be simpler and the pop up tips can help you start playing the game buy cheap world of warcraft gold immediately. If on the other hand, you need a detailed manual, the instructions are there for you to access. Buy wow gold in this site,good for you ,WoW Gold, BUY WOW GOLD.

If you are cheap wow gold trying any unknown cheats to earn gold, you would cheapest wow gold face some problem and your account will be black out. So don't try to wow gold cheap find cheats instead try to wow7gold follow the guideline of world of warcraft. These tips could euwowgoldwork as gold cheat and can help a lot to earn gold and money. World of Warcraft is the most exiting online game and while Playing the game most of the players struggle ogpal to earn a lot of gold.

Most of the players World Of Warcraft Goldtry search cheat code for this game to earn gold. This article will help xowow you a lot to earn more and more gold.The best way to earn gold in this online game is by going through the guidelines wow gold for saleand other information about wowgold4europethe game that are available on the internet .

Weaknesses of World Of Warcraft Gold the client-server model used by World of Warcraft have been wow power levelingexploited in order to crash the cluster of servers that make up a realm. Exploits also include characters being able to instantly change location or teleport. The situation Cheap Wow Goldbecame worse when trying to coordinate activities across a number of players cheapest wow goldor guilds on the same realm.World of Warcraft Lead Producer, stated that new realms would be introduced to relieve the burden on existing ones. Existing realms would be upgraded.

Although the game wow gold follows a similar model to others in the genreand was noted for having buy cheap wow goldmany familiar concepts from roleplaying games, the new approaches wow gold cheap to reduce pauses between game encounters was gameusd well liked. At various times, World of Warcraft players have experienced problems with connecting to and logging in to wow gold for sale the game. Sudden server crashes that would force realms offline also occurred.

It was not long cheap wow goldbefore some one knocked at wow gold for salethe house-door and called, open the door, dear children, your mother is here, and wow gold cheap has brought something back with her for each of you. But the little cheapest wow goldkids knew that it was the wolf, by the rough voice. We will fastgg not open the door, cried they, you are not our mother. She has a soft, pleasant voice, but your voice is rough, you are the wolf.

Then the wolf went World Of Warcraft Goldaway to a shopkeeper and bought himself a great lump of chalk, ate this and made mmogap his voice soft with it. The he came back, knocked at the door of the house, and igsky called, open the door, dear children, your mother is here and Cheapest Wow Goldhas brought something back with her for each of you.