Friday, December 24, 2010

Some Notes on the Material Circumstances of an Inspired Idea

Editor's note: this a strange thing to write down, it's true, but I always think back to George Polya's comments in his clever little book on meta-problem solving, "How to Solve It", on the art and the surprising mysteriousness of coming up with really, really good ideas, i.e. inspiration. I've only had a very small number of such ideas, and their mystery is intriguing enough that I decided the circumstances of this latest one might be interesting to record to posterity.

The idea itself deserves an entirely separate exposition, and will have to wait for another time.

* * *

Snowed in the morning. Woke up earlier than usual, ate, prepared to go out. Road conditions were poor, so I dozed off for several more hours. Had extremely engaging, vivid, and colorful dreams, involving several very broad, sweeping landscapes, a train, more snow, a broad hillside view, many angry accusations, the speaking of foreign languages, the encountering of a partially visible and extremely valuable but dangerous artifact, frightening infirmity, shocking police corruptions, fossil fuels.

Spent day dabbling in various interests I had not had time for; investigated possibility for shoe-horning the Arduino into a full-on software radio, played a game of Go on PANDANET IGS (and won), read half of "Birth of the Clinic: An Archaeology of Medical Perception" by Michel Foucault. Had finished two other books earlier in the week, namely "Critical Path" by R. Buckminster Fuller, and "Thinking in Systems: A Primer" by Donella H. Meadows. Had spent most of that week, and the several weeks preceding, working very intensely on a stylized demonstration compiler exhibiting Harrison's resumption-monadic kernels as a an alternative way of compiling functional programming languages. This involved the introduction, absorption and quick application of a lot of new and highly formal concepts I had not really encountered or used before. Exhausted by these earlier efforts, and by an over-strenuous physical regimen that appears to have caused me some internal injury, this dabbling was a means of rest and recreation.

Also read several short passages from Eihei Dogen's "Extensive Record" ("A deluded person and an enlightened person at the same time use one boat [to cross the river] and each is not obstructed." -- Volume 1, lecture 52, 'Study of Sounds and Colors') and the Book of Chuang-Tzu ("When a man has been killed in battle and people come to bury him, he has no use for his medals." -- 'The Sign of Virtue Complete')

Visiting with family for the holiday, persuaded them to watch "Exit Through the Gift Shop", the peculiar documentary (?) of a supposed meeting between internationally renowned street artist Banksy and one Mr. Thierry Guetta, who, inspired by such street artists, began his own budding art career, which then went on to exemplify everything that street art had rebelled against. Drove sister home. Briefly discussed the film.

Went to Eastside Tavern for "Dirty Disco Dance Party", but no one was dancing, so I sat at the bar and had a beer. As I generally always do, I sat alone and contemplated whatever thoughts happened to enter my mind. Thought about an LED array I had assembled from a kit, and its possible applications to creating interactive devices that would allow visualization of otherwise invisible ambient data in real time. Thought of this partially from something I read in Meadows' book, regarding electric meters in the Netherlands and electricity usage. Thought about how the array I had assembled had several bulbs that were not working, and speculated as to why this might be. Also thought about the essentially finite nature of any output data the devices might produce, and thought about the contrast between this relatively small state space and the very large state space representing not only the physical device itself, but all the materials comprising it. Also thought about how this limited output state space relates to function. Was surprised to consider how strangely ephemeral the notion of the "boundary" of a system is, or even the idea that a system is an isolable thing at all. Wondered whether this notion of "isolable system" is a cultural artifact, and would be considered strange by an equally advanced culture with a very different history from mine. Thought about the various parts and functions of a system (still visualizing the LED array) as peaks and troughs in a series of waves of different frequencies, sometimes overlapping, sometimes not. This reminded me of something from Fuller's book regarding a paradigm revolution in the Twentieth century view, i.e. "a world normally in motion" as opposed to "normally at rest". Thought of Fourier transforms. Suddenly recollected something I had read in the ARRL Radio Engineering Manual about the Nyquist Sampling Criterion, that I had read that afternoon while trying to learn how to construct a rudimentary antenna for Arduino. Saw a very unexpected relationship between this and other thoughts about "systems" and what they are generally. Was pleasantly surprised, but did not make much of it at the moment; wrote a quick note to self in my notepad and continued drinking beer. Left when the beer was finished.

As I drove home, the idea seemed to gain further and further significance, snowballing into something that seemed at once very broad and very clear, with very concrete analogies to what seem to be well-understood and respected theories. Became more and more surprised and excited the more I thought of this. Resolved to make a note of all aspects of the concept immediately occurring to me. Wrote these down in my research notebook. Idea turned out to be a broad generalization of a very particular computer security problem that I had tried to formulate a definition of for some months; although I had formulated a workable definition, something about this previous, more specific idea seemed strangely too specific, as if missing some other important principle. Judged this new principle to be what was missing.

Also decided to write this account, because although this has happened to me before, it has not happened many times, and I would be curious to later observe and reflect upon the circumstances surrounding the appearance of a really, really good idea occurs to me.

Thursday, July 29, 2010

If Technology Is Cheap, Why Is Prosperity So Expensive?

Cockroaches and pigeons seem to do quite well for themselves. Any visit to an urban center of appreciable size should be sufficient to confirm this observation. Common belief seems to hold that these, and other species considered urban vermin, prosper due to inherent durability and resourcefulness, or to some other difficult-to-qualify fitness for life -- hence the frequently repeated quip that after nuclear war, the roaches will inherit the Earth.

While I do not wish to speak ill of the cockroach or the common rock dove (Columba livia) or their tremendous success, it is worth pointing out that one-fourth of all food produced for human consumption is wasted [3], and so, inherent fitness notwithstanding, our pests suffer no shortage of nourishment. Taking into account that increased food supplies generally correlate to population growth, the abundance of pests in and around areas of concentrated human habitation is more likely due to our own wastefulness than to any of the species' individual hardiness. Phrased another way, our prosperity is so tremendous that we in the developed world somehow afford to feed not only ourselves but a large population of animals in which we have no agricultural or economic interest. While this may be prosperity, it is prosperity of a very strange and negligent kind. Arguably, this strangeness and wastefulness it not particular to the production and consumption of food, but to many other facets of our economy as well.

It is a favorite charge of American conservatism that 'poverty' in America is no longer objective destitution, but merely an economic position of relatively less affluence. [7] This claim does have a factual basis; Americans, in general, do not suffer from "extreme poverty", meaning the inability to meet the basic needs of food, water, shelter, sanitation, and healthcare necessary to sustain life. Such arguments correctly address the factual matter of whether or not Americans suffer severe, life-threatening privation (they do not), but do nothing to answer the question of whether our tremendous material surplus is well-spent. It is well and good that our poor do not starve, but should we really settle for an American Dream or a Human Aspiration that looks no further than a full stomach?

The same pundits who belittle American poverty are also quick to note that ninety-seven percent of households classified as 'poor' own a television. [ibid] Television ownership among Americans generally hovers around this figure. The average American spends four hours a day watching television (a figure offered both by A. C. Nielsen and satellite provider Dish Network), which readily translates into 1460 hours (about two round-the-clock months) of television viewing in a given year. Given that a typical Energy Star certified television set consumes about 208 watts of power [4], and that ninety-seven percent of the roughly 115 million households in America own at least one set, it is readily calculated that approximately 40 terajoules (4 * 10^13 J) of energy are expended each year just to receive and view television broadcasts.

In perspective, the atomic bomb detonated over Hiroshima released approximately 60 terajoules[6]. What this means is that the United States annually spends two thirds the energy-yield of the first nuclear weapon on such intellectual pursuits as the choice of a new "American Idol".

We humans have reached a point in history where at least some of us can afford to watch over 1400 hours of television apiece each year. (Anecdotally, but more currently relevant, time spent online is now on the same order of magnitude.) We are the beneficiaries of a superabundance so profound that we live out our lives largely free from thirst, hunger, most disease, or even the threat of bodily harm through physical violence (unless you happen to live in certain parts of certain urban centers). Please do not underestimate the significance of this point. If you live in the developed world, you live a life of luxury that would be unimaginable if you were not already experiencing it. What are we doing with all the time we are not spending in fear of drought, famine, and pestilence?

Early technologists prophesied that the work-week in the industrialized world would gradually dwindle, or perhaps even vanish altogether. Norbert Wiener prognosticated that automation would usher in an epoch of unemployment so severe that the Great Depression of the 1930s would appear as a "pleasant joke". The distinguished R. Buckminster Fuller foresaw the day when a "research fellowship" would be granted to each and every citizen, to do with as he or she saw fit. It is now 2010, and to the best of my knowledge, neither of these things, nor anything like them, has happened. The U.S. Bureau of Labor Statistics reports that employed persons still work a roughly 8-hour day [9], and the United States Congress is presently engaged in an ugly, ideology-poisoned debate over whether Federal unemployment insurance benefits should be extended -- which would seem to indicate that anything so generous as a "research fellowship" is out of the legislative question. Meanwhile, "retail salespersons" and "cashiers" accounted for 1 out of every 17 employed positions in 2009 [10], with "office clerks, general" and "combined food preparation" following closely behind -- which is to say that, technological advance and intellectual liberty notwithstanding, the presently constituted economy sees fit to employ the largest portion of our citizens selling things and doing paperwork. A large fraction of us are employed in roles custodial to institutions whose relation to material or intellectual production is secondary at best. We would be right to question the operation of such an economy; it may be that the remaining sectors produce enough to sustain the material status quo, but does such an arrangement represent an efficient use of human potentials and the real wealth they represent?

We as a nation, perhaps even as a whole species, are now free to do as we please with a fairly large portion of our time, and to do so with the informational and material support of high technology. A popular slogan of the Linux community is: "put enough eyes on it, and no bug is invisible." This slogan was picked up by Robert David Steele's Open Source Intelligence (OSINT) initiative [8], which bases itself upon the philosophy that bottom-up organization of ordinary citizens in the task of information gathering and analysis is vastly more effective than reliance upon a small corps of expert analysts. (As an aside, I had the good fortune to meet and speak with Mr. Steele at this year's HOPE in New York City, and I can honestly say that this meeting impressed upon me considerable personal respect for him.) If broad public participation can benefit such diverse endeavors as operating system implementation and national security information gathering, it can surely be of service other problem domains as well. The building blocks of high technology are now cheaply, commercially available to anyone. It amazes me that I can walk into a Radioshack store and purchase an assortment of prefabricated transistors, along with the tools to wire them into a useful circuit, for just a few dollars. It amazes me that production quality compilers are freely available for all major programming languages -- even complex, cutting-edge languages like Haskell -- and are easy to use. One often hears of how "information technology" has revolutionized our economy and our culture, but the most important fact is the one least remarked upon: the essential building blocks of this revolution are readily available and perfectly usable by anyone who takes the proper initiative.

Economist W. Brian Arthur recently remarked that all technologies are assembled from other technologies. [1] While this may at first glance appear an innocuous observation, it has tremendous consequences for a society in which the products of high technology are widely, cheaply available in modular, readily usable forms. By virtue of sheer combinatorial magnitude, the number of useful technologies waiting to be discovered among the almost endless arrangements of commercially available parts and pieces is astounding. Although, as Americans, we have been largely conditioned to believe in "making a living" by any means available, Fuller's constituents of wealth are worth recollecting: wealth is the product of time, energy, and knowledge. Thanks to industrial technology, energy is plentiful. Thanks to prosperity, time is abundant. Thanks to the global communications network, knowledge is now ubiquitous. But how much of the available knowledge is actually being harnessed and put to work? Are ordinary Americans -- honest and capable people all -- using anything close to 40 terajoules of energy to understand and solve tomorrow's problems? Can our so-called "knowledge" economy be said to be using its time and energy in accordance with the best available knowledge when so many of its employees must condescend to be mere functionaries of non-producing institutions?

It is the top-down mode of developing and deploying technology that is responsible for the exclusion of ordinary citizens from the evolution and application of humanity's greatest powers, and failures of the top-down approach to technological use and development have become painfully evident. The current hundred-day fiasco in the Gulf of Mexico is, once again, highly instructive. When an oil well under development began to freely spew oil into the Gulf after the Deepwater Horizon's catastrophic explosion, all U.S. Federal agencies stood by, largely helpless by their own admission [2] to stop the leak. Despite many theatrical reproaches, the task of cleaning up the spill and stopping the leak were left primarily to British Petroleum, the very entity whose gross negligence was the original cause of the disaster. This heavy reliance upon BP's resources and technical knowledge opened the way for BP's indiscriminate application of untested and highly toxic [5], oil dispersants, in an apparent attempt by BP to conceal the full extent and severity of the spill by reducing the amount of detectable oil on the water's surface. The lesson in this episode is painfully clear: even the experts sometimes fail. More importantly, when the experts do fail, they have a material interest in hiding that fact from the people they purport to serve, often with very damaging consequences.

If people are empowered to create solutions to the problems that they see, they will. When I say "people" here, I do not mean particular experts or persons situated in any particular professional context; I mean anyone. Moreover, those people who do take it upon themselves to solve a problem will generally factor their own personal and communal welfare into the solution as basic constraints on the problem space. Given enough information, individuals generally know what is in their own best interest and act accordingly. Large institutions, whether private or government, purport to act according to common interests, but also act in their own interests, with primacy tacitly given to the latter over the former. This is an important distinction, especially in the context of high technology, its powers and its dangers. Although it continues to be fashionable in some quarters to cast technology as a malevolent force that "controls" or "dominates" our modern lives (I think particularly of Neil Postman's somewhat old, and rather error-ridden, but still widely read "Technopoly"), it is only our alienation from technology that allows for domination or control to take place. We live in a very extraordinaty time in history, when ordinary citizens are able to understand and apply technology according to their own needs and purposes -- provided they take it upon themselves to do so. The neo-agrarianism of the "sustainability" movement is arguably a reclamation of the very earliest technologies, and the discovery that they are within the grasp and purview of any and all ordinary citizens. However, the lesson of sustainability is not that we are better off returning to an agrarian society (a thesis that I personally disagree with), but that we are better off when we take full ownership of humankind's technological heritage, as individuals whose wills and purposes will shape its development and use.

Prosperity need not be expensive or difficult -- but it is not inevitable either. We should not delude ourselves into believing that affluence is simply the product of some vaguely defined virtues inherent to ourselves, nor should we should suppose that if the big system should all come crashing down, we will somehow persist in spite of catastrophe. The material ease and luxury we enjoy now is indeed the result of increasingly uncomfortable and tenuous dependence, but it is also a success that we can take full responsibility for -- if only we are willing to entrust our most powerful tools to ourselves and to all our fellow citizens alike.




[1] W. Brian Arthur. "The Nature of Technology: What It Is and How It Evolves", The Free Press, 2009.

[2] public comments made by Coast Guard Commandant Adm. Thad Allen, speaking at a White House briefing on May 25, 2010.

[3] "Estimating and Addressing America's Food Loses", Economic Research Service, USDA 1997.

[4] ENERGY STAR Program Requirements for TVs, Version 3.0.

[5] "EPA Response to BP Spill in the Gulf of Mexico", accessed here.

[6] John Malik, The yields of the Hiroshima and Nagasaki nuclear explosions, Los Alamos National Laboratory report LA-8819, September 1985. Available here

[7] "Understanding Poverty in America", Robert Rector and Kirk Johnson, Heritage Foundation, 2004, available here

[8] "Human Intelligence: All Humans, All Minds, All the Time", Robert David Steele. Available in full here.

[9] American Time Use Survey -- 2009 Results, U.S. Bureau of Labor Statistics

[10] "Occupational Employment Statistics Highlights", U.S. Bureau of Labor Statistics, June 2010

Friday, June 4, 2010

Barbarians on the Shore

Old Archbishop Dom Gregory Diamare, the abbot [of Monte Cassino], talking one day to [Count] Gavronski about the barbarism into which Europe was in danger of sinking through war, said that during the darkest Middle Ages the monks of Monte Cassino had saved Western civilization by copying the ancient and precious Greek and Latin manuscripts by hand. "What should we do today to save European culture?" concluded the venerable abbot. "Have the same manuscripts copied on typewriters by your monks," replied Gavronski. [2]




On April 20, the Deepwater Horizon oil rig, leased by British Petroleum to drill for oil off U.S. coastline adjoining the Gulf of Mexico, suffered a catastrophic explosion which killed 11, injured 17, and caused the rig to sink to the bottom of the ocean. As of this writing, the ruptured oil well head has spewed crude oil into the Gulf of Mexico continuously for 46 days. Numerous attempts to stop the flow of oil have failed.

A great deal else about this incident has already been said, and continues to be said elsewhere. It would seem idle to recount the technical facts of petroleum extraction and spill response, or to add to the litany of well-deserved blame and opprobrium. The episode of the Deepwater Horizon oil spill is plainly horrifying for the nightmarish destruction it wreaks, and will to continue to wreak, on a large part of the world we live in. It is, however, equally horrifying for a much subtler reason that we all, as architects and beneficiaries of late technological civilization as it exists today, would do well to contemplate.

It deserves to be said that extracting oil from deep beneath the ocean floor is an engineering feat so complex and difficult that its success could justly be called miraculous. This is to say nothing of the scientific knowledge that made it possible for humans to convert a chemical compound, stored millions of years ago deep within the Earth's crust, into vastly powerful source of energy, ready to almost any imaginable use to which its possessors might put it. The activities of the Deepwater Horizon before the catastrophe represent a display of amazing technological power. The utter failure of attempts to seal the Deepwater Horizon's ruptured well represent the amazing impotence of that same technological power in the face of its own consequences.

How are the limitations of our own technological powers currently understood and dealt with by those who most directly wield them? A public comment on the catastrophe by former Environmental Protection Agency (EPA) administrator and former CEO of Shell Oil, William Reilly, is telling:

The extraordinary success of this industry in developing technology to go deeper and deeper into the sea to put down a well, essential well, and then go out in all directions to get the product up is breathtaking.

And the condition, as nearly as I can tell from looking at the photographs and the movies from what's happening in the Gulf, is that the response technology is about as primitive as it was in the Exxon Valdez case [over 20 years ago]. That is the skimmers that are dysfunctional in the open ocean, the booms that break, as you say, with the slightest wave action, dispersants that are not ready for prime time, that may or may not be toxic, something that has to be determined in the event, which seems to me ought to have been anticipated, with impacts on fish that really need to be very carefully acknowledged and may or may not have been.
[3]

If a comment such as this one, on an episode such as that currently facing the United States, is at all revealing, then it points to an alarming short-sightedness and gross indifference to risk on the part of those who manage and direct of some of the human species' greatest technological powers. In a more immediate setting, such destructive myopia and callousness would be termed 'barbarism.'

Communitarian philosopher Alisdair MacIntyre memorably wrote less than 30 years ago that "the Barbarians are not waiting beyond the frontiers; they have already been governing us for quite some time."[1] MacIntyre was concerned with what he saw as the rapid decay of morality and civility in the West, but in light of comments such as those by Mr. Reilly above, such a sentiment certainly applies to the frightening negligence with which the high technology of the human species has been lately deployed. The threat of such negligence is twofold: either the human species will effect technological suicide, or our civilization will abruptly and violently recoil (or be forced to recoil) from the powerful tools we have developed to serve human needs and wants. We have no reason to believe that either outcome is inevitable, but neither do we have any good reason to believe that either is impossible.

The threat of technological self-destruction is not a new appearance, and much comment has already been made on it, especially through the latter half of the 20th century. Much more insidious is threat that our way of life may collapse due to a justified but unmanageable aversion to the tools and mechanisms that sustain it. Barbarism begets barbarism. Every technology devised serves some genuine human want, and so no such device is fundamentally evil or corrupt. Be that as it may, many of our powers are now routinely used by persons and organizations whose motives are at best short-sighted. With this misconduct comes the real danger of delegitimizing the base of theoretical and practical knowledge sustaining the technologies that now feed, clothe, and shelter more of humanity than at any other time in history. Accumulated knowledge is surprisingly fragile, and if our civilization comes to associate our current powers only with greed and destruction -- a view which is still in the minority, but growing both in range and intensity -- there is a real threat that it may be neglected and thereby lost.

It is only through the labors of a preciously small number of scholars and monastics that the works of Classical civilization survived into the Renaissance. Such ancient ideas may at first appear flawed or baseless when viewed in retrospect, through centuries of intellectual and scientific progress. It should nonetheless be remembered that at the time, the ancient works of the Greeks and Romans represented the limits of human learning, and went on to lay the foundation for the very erudition that now finds them quaint. As oil spews unabated into the ocean adjoining one of the most affluent and powerful nations on Earth, it seems conjectural but not idle to fear the coming of a technological and economic dark age. In spite of the abuses to which it has been put, we have labored long and hard for the scientific and engineering knowledge the human species has accumulated, and should not easily let it go, and more work remains if this knowledge is to be transmitted to future generations.

There is good reason to believe that the barbarians are upon us, and this peril issues an urgent question to the scientists, engineers, technologists, scholars, and ordinary citizens of this time and place: What part of our technological knowledge can we save, and how?




[1] MacIntyre, Alisdair. After Virtue. University of Notre Dame Press, 1984.

[2] Malaparte, Curzio, Cesare Foligno (trans.). Kaputt. New York Review of Books, 2005.

[3] Originally broadcast June 3, 2010, on MSNBC's "The Rachel Maddow Show". Video also available here.

Thursday, February 18, 2010

The Not-Understanding Perceptron, and the Grim Shadow of the "Average Man"

... and if you're too intelligent
they'll cut you down to size;
they'll praise you till you're happy,
then they'll fill you full of lies ...


"Cradle to the Grave", album of the same name, Subhumans (1983)




A friend of mine came up to me unexpectedly today, with some obvious concern and agitation. "Can I ask you about something? Could you explain something to me?" he said. I said okay, and he took a piece of paper out of his pocket and began folding it awkwardly back and forth, trying to hide most of the contents while showing me just one small part. Finally, he handed it to me and asked very soberly, "What does this mean?" I looked the paper. It was a score from an IQ test. The score was not good.

It was at that point that I thought about what it must feel like to receive a piece of paper that tells you that you are officially stupid.

I've known this friend for a while. He had a difficult past. He's attending a local community college. He wants to go on to some position where he can counsel troubled kids -- not kids who are troubled about the usual things that trouble kids, but kids who are troubled in a way that's bigger and deeper and harder to articulate, who have been to jail, or will likely end up there soon. He's an honest person. He's a curious person. He works hard. And I could tell that he understood what the paper said, at least in literal terms. I could tell he was hoping, perhaps, that there was some subtle detail of the report that would nullify or at least mitigate the coldly obvious meaning. It was not a question about scales or confidence intervals, even though I explained these ideas at some length so as not to seem flippant or condescending.

There was no way I could just hand the paper back and say, "It means you have a low IQ."

What happened is, I sat back in my chair and said this:

"Look, I don't know much about this sort of thing or about IQ tests or what they're really good for or exactly what they mean. They've been around for a while, and a lot of people have criticized them for a lot of reasons, and they still give them out anyway, but none of that is really the point. The point is that it's all bullshit. The point is that a test score just tells you how well you scored on a test, and nothing more than that. For some reason, we've come to live in a fucked up world where people give us test after test after test to evaluate what use we, as human beings, have to them, as figures of power and authority. It's a bad measure. What's really good and interesting about human beings is how adaptable we are. If we can't do things one way, we can find another. We're never incapable; the only thing we ever lack is persistence or inventiveness. This score doesn't matter. It doesn't tell you what you can or can't do. It doesn't tell you whether or not you'll succeed in life. It doesn't tell you who you are. Those are all things that you determine for yourself. So the meaning is nothing; it's just a test, don't worry about it. Life isn't a test; it's a challenge. It's hard, but there's always another way. There's always a way to live."

Then I handed the paper back, and left.

I sincerely wonder why we insist on so many abstract metrics of people. They may serve an organizational purpose, but they serve no individual purpose, and in some cases even represent and individual harm. Perhaps it's a bit worn and trite to criticize tests and tell people that they can do whatever they want. I acknowledge that not everyone has the same abilities. I acknowledge that some people will try things and succeed, while other people will try things and fail. I acknowledge that we are all stuck playing with the lot we're dealt. What I take exception to is the proposition, implicit in every quantitative metric of a person, that there are only a certain number of clearly circumscribed roles a person may play in life, and all of those can be characterized by a certain number of simple, measurable quantities.

I don't think anyone would dispute the simple proposition that capability is only really proven when the thing is done. Can you write? Write something. Can you fight? Fight someone. Can you think? Come up with an idea. That is all fine and good, but what is often not recognized is that narrow metrics such as standardized questionnaires and puzzles measure only a person's competence in one particular strategy of doing, not that person's overall capacity for thinking, learning, or doing. There is an enormous breadth and variety to the genres of writing, styles of fighting, and certainly to ideas. In the end, the one goal that all of us hold as ultimate is simply to live. As far as I can see, the measure of that is something that we all figure out for ourselves.

I wouldn't be the first person to criticize the IQ test; as far back as Vygotsky and Luria, people were well aware of the influence of a industrialized education on the direction of concept use and formation. The modern practice of measuring by standardized test even resembles, to some substantial degree, the operation of very primitive feature-weighting recognizers (e.g. Rosenblatt's perceptron), which Minksy and Papert famously showed could not even distinguish the presence of such basic relationships as continuity. There is a remarkable synthesis in the way human cognition sees form as function and function as form; one sees it everywhere, in our tools, in our art, in our basic ways of thinking. Batteries of questions aimed at abstracting some particular feature of an individual, however, separate the form of the person from the function being sought. The issue is not one of which kinds of intelligence we should measure, or which quantities are really important in determining health, fitness, or success. The issue is that the measurement of finite quantities is a procedure fundamentally insufficient to the task of determining what we should do with ourselves, or how.

If that sounds like a trope or a triviality, stop and really imagine for yourself how exactly would it feel to receive an scientific report documenting how stupid you are.

One of the really interesting things about being human is that we make purposes and meanings for ourselves. This is not an inspirational appeal that takes us away from the compelling argument that simple biological impulses underly our lives and activities. This is assertion of the brilliant complexity with which those impulses manifest when placed in a brilliantly complex world. What's amazing is that we all end up acting as differently as we do even though we all start with same small handful of biological goals and directives. A clever strategy can turn a weakness into a strength. Sometimes, the meek really do inherit the Earth, and nobody sees it coming.

Sometimes, however, is not the same as always. Sometimes the test speaks the truth. Sometimes might is right. Possibility, however, is an essential organizing principle of how we think about ourselves and the directions of our lives. To borrow notions from the cognitive scientists, our identity is fundamentally tied to a self-ideal, that is, to a persistent thought not just of who we but who we want to be. Without the ability to imagine possible selves and possible futures, the whole sense of self collapses. If tomorrow's outcomes are all completely and fully known today, there is no human sense in bothering to live them all out. (This assertion is pregnant with all kinds of epistemological interpretations.) Of course we need to know, in plain, unsparing terms, how the world is. Of course we need to know, frankly and directly, what our weakness are. But each of us, if we are to go on living at all, also has to be able to imagine better.

I have an above-average IQ. I know this because in fourth grade I went to a quiet, out-of-the-way room in my school and took a strange-looking test, after which they sent me to a so-called "gifted program" once a week. There, we got to do things like tinker with fractal-generating computer programs and assemble-your-own-robot kits. I liked the things we learned, and I liked the absence of the overbearing regimentation that pervades ordinary public schooling, but to tell the truth, I never liked any of the other children there. They all knew that they had taken a test, and that adults approved. They knew that they had been declared officially intelligent. As such, they were all filled with insufferable smugness and self-satisfaction. Knowing that they could do things to please adults, they competed viciously among one another for praise and attention. Based on my later contact with intelligent, talented, and highly educated persons in my adult life, these are features that, I am almost certain, many if not most such children retain for the rest of their lives. Knowing that you have been blessed with "the gift", it is difficult to resist fascination with your own wonderful ability. Having this fascination, it becomes difficult to arouse much interest in what your work means for the other humans you share the world with, what shortcomings or limitations you might have despite your talents, or what people without "the gift" might think or have to say. Having a belief in your own excellent function, you lose the form of yourself as human being, with all the frailties and blights that entails.

Blame or praise only really help when they suggest new directions. There is no "good function" or "bad function", only "good for this" or "bad for that". The only real function is to live out our lives, and that is something we do in whatever way we choose. So what if you have a low IQ? Human chess players are helpless to beat powerful chess playing algorithm, but people still play chess. The joy of a game is just in the playing; in just the same way, the joy of living is not in solving any single problem, or meeting any one goal. So what if you have a high IQ? Your shit still stinks, and somebody still has to clean it up. The world is unimaginably huge and complicated, but everyone has a place in it. Contrary to some opinions, there is no placement test to tell you where.

Saturday, February 6, 2010

Implications of Universality for Computer Security

"In the United States (U.S.), we have items available for all our needs. Many of these items are cheap and easy to replace when damaged. Our easy-come, easy-go, easy-to-replace culture makes it unnecessary for us to improvise. This inexperience in 'making do' can be an enemy in a survival situation. Learn to improvise. Take a tool designed for a specific purpose and see how many other uses you can make of it." (U.S. Army Field Manual FM 3-05.70, "Survival", May 2002)

One of the most noteworthy features of computer security is its overwhelmingly defensive stance. While there are certain programming practices that mitigate threats (e.g. sanitize your inputs, check your array bounds), it is practically impossible to preclude all possible attempts to corrupt or co-opt a system. Granted, there are always a few stubborn hold-outs willing to step forward and claim that the system that they have constructed is constructed in that elusive "right way" that everyone so far has failed at. It's possible that one of these people may be right, but evidence seems to weigh against such claims.

All the way back in 1993, a landmark report from the Naval Research Laboratory [3] found that almost half of 50 serious security breaches involved code that correctly implemented its specification. Of course, that was well over 15 years ago, and so one might protest that perhaps some better model of security has come forward since that time. Even so, one has to take notice when large teams of talented programmers correctly implement a meticulously specified system, and the system nonetheless succumbs to attack. Cases such as this lead illustrious security researcher William Wulf to call for a revolutionized approach to security that abandons the old paradigms of "perimeter defense" [7] as late as last year. Wulf proposes a model of security inspired by the success of the Internet, wherein a small foundation with minimal but very general functionality allows for systems to adapt to localized and quickly evolving conditions as needed and desired. This seems a very pragmatic and promising approach, and the success of the Internet is nothing to sneeze at. Even so, one cannot help but wonder what exactly it is about the traditional way of doing things that leads it to fail.

Let's consider a very intuitive idea from the traditional theory of security. Noninterference is a rather early and very successful idea due originally to J. A. Goguen and J. Meseguer [2] that can be informally phrased as follows: if two users (or processes) share a system, then the action of one should have no effect on the other. In some sense, this is like what we would expect in many kinds of situations where security is important: if you're on a time-sharing system, you don't want your files, or what you do to them, to be visible to other people; if you're buying something online, you don't want the credit card number you send to the vendor to somehow end up on the computer of some third party not part of the transaction. Of course, such assurances are very hard to make on large systems that a lot of people use; it would be pure whimsy to suggest that one could ever make such an assurance about the Internet (especially considering that large-scale data mining by merchants and advertisers already counts, arguably, as producing unwanted side-effects), and it would even seem like a bit of stretch to make absolute promises about a large, practical system that a lot of different people had to use to readily exchange information. However, suppose that someone were to successfully construct a shared system conforming to Goguen-Meseguer noninterference; if we were really that confident in its conception and construction, we could be assured that no one would be meddling in anyone else's data, nor would the kernel be unwittingly divulging any secrets to attackers bent on trying to compromise it.

Here's the catch: even a perfectly conceived and constructed system has to interact with the rest of the world in order to be used by anyone. This of course introduces the vector of social engineering, whereby the human element becomes part of the system. Even so, we don't have to rely on operator fallibility to show how problems immediately and essentially arise once the theoretical construct is out of its own solitary universe. One such very simple and very clever example is due to Daryl McCullough [4], and works essentially as follows:





Imagine we don't want any information flowing from the red parts of the system to the blue parts, although blue-to-red is okay. (This is indicated by the directions of the arrows.) Considered separately, the blue and red parts of the system both satisfy noninterference, since the red portion consists only of a single process, while the blue portion is defined in such a way that its two processes never interact. Does the entire system obey noninterference, once its parts are put together? It turns out that it does not.

The reason for this comes from a subtle but important detail of machines, namely, their finiteness. Suppose that processes A and B fill up their respective input buffers -- which they certainly can do in any kind of realistic machine. Should they start throwing away messages, or should they wait? We don't want to lose any messages, so we insist that the processes wait once their respective buffers fill up. However, in order to know to wait, the buffer or some mechanism attached to it must be able to send signals back to its process, telling either to go ahead or wait. That is, we want our processes to perform blocking reads and writes on the buffers, wherein their execution is suspended until the necessary read or write becomes possible. Now suppose, that our red process has a one-bit input from S that is uses to decide which of buffers A or B to read from, i.e. red multiplexes A and B according to the input it receives from S. The red process waits until acknowledgment arrives in buffer C before reading the next input from S. Suppose processes A and B immediately fill their respective buffers; once our red process reads from one of them, the buffer will have space for a new message, and will signal back to its respective process that it can go ahead with its execution. This is all good and fine and perfectly reasonable. What's the problem? The problem is this: suppose also that A writes some innocuous notice to the output on the left, say '0', each time it sends to buffer A, and that B writes '1' to the same source each time it sends to buffer B. Why is this problem? Because, given this setup, the stream of bits being written to the (blue) output on the left now exactly matches the stream of inputs being read from the (red) input on the right, which is precisely what we did not want to happen.

One immediate conclusion that one can draw from this result is that some security properties simply are not composable, that is, even if two different systems exhibit the property, there is no guarantee that putting them together will result in a system that exhibits the same property. However, I think that there is another informative way of looking at what's happening in McCullough's example: connecting the blue to the red system gives the blue system an opportunity to emulate red.

Emulation is an idea that goes all the way back to Alan Turing's universal computer. In essence, one machine emulates another whenever it performs computations equivalent in rule and structure to another. This is what gives Turing's machine its universality; it has the capability to emulate any of a very large class of other machines, and hence to perform any computation of which any machine in that class is capable. Chip developers use emulators to test against design errors. Nostalgic gamers use emulators to play titles from long-defunct platforms on modern personal computers. Interpreted programming languages (e.g. Java) use an emulated abstract computer to achieve some measure of portability. However, the basic principle that one machine (or tool) can serve in the stead of any of large class of others seems to me much broader and deeper than any of the niche purposes to which it has so far been put, especially as regards security.

Most prisons in the United States place rigid constraints on what sorts of items prisoners are allowed to keep in their cells. The reason for this is that a small piece of metal or a hard, sturdy object can easily be improvised into an excavating tool or a weapon, given the proper motivation -- of which prison inmates typically have an abundance. Ingenuity in making and using tools is one of the distinguishing and noteworthy characteristics of humanity, and the dramatic success of the tool-weilding primate is a testament to the power of a usable tool, however crude. This is not a new or surprising observation. However, it is truly astonishing to observe the huge disparity between the smallness of the means necessary to cause a disruption and the explosive magnitude of the disruption itself. Who would have ever imagined that using a bludgeon instead of fists and teeth would have catapulted humans to the position of dominant predator, or that millennia later those same humans would be improvising artifacts for personal hygiene into deadly melee weapons?

What we have here is a very broad principle. How does it apply?

A number of attempts were made during the 1960s and 1970s to construct a universal Turing machine with the smallest number of possible states; Marvin Minsky constructed one with only 7 states and 4 symbols in 1962 [5]. Successive attempts collected and published by Yuri Rogozhin in 1998 produced at least one smaller machine. In 1985, Stephen Wolfram claimed that his famous Rule 110 one-dimensional cellular automaton was able to emulate a Turing machine with only two states and five symbols, sketching a proof in his widely read and controversial 2002 opus [6]. Though such constructions always give some whiff of obsession with arcana, they also give very concrete evidence of a genuinely startling conclusion: it takes very, very little in order to make almost anything possible.

This should be a very potent lesson for the discipline computer security. Systems can be very tightly walled off from the rest of the world, but it takes only a very narrow gap for an attacker to worm his way in. A first reflex is to try to wall off the system even tighter but this, ultimately, turns out to be a failing solution: one can only constrain the system's use so much before it becomes completely unusable, whereas the attacker needs only the slightest concession in order to devise an exploit. This seems to confirm Wulf's argument that a pitched battle over the integrity of a rigid boundary is doomed to defeat. However, it also gives a potentially very useful language in which to phrase the problems of security. Consider the following informal conjecture:

If a system S allows its users functionality F, then S is vulnerable to an exploit E if and only if F is computationally expressive enough to emulate E.

This is plainly visible in McCullough's construction above; the blocking signal from a full buffer gives the blue portion of the system exactly enough information to act as if it were reading off of the secret input buffer. Erik Buchanan, Ryan Roemer, and Stefan Savage presented a method of constructing exploits without the use of code injection (which I also cited here several months ago) at Black Hat 2008 [1], which seems to confirm this very same intuition. The authors showed that subverting normal control flow was sufficient to coerce "trusted" code into arbitrary computations, thus producing "bad" code without the need to introduce any new code.

Explaining security breaches in terms of "emulating your inferiors" also provides a graded metric of susceptibility. (This may be useful if it turns out that Mr. Wolfram is indeed right and the world is rife with computational universality.) If one system is capable of emulating another, then the time complexity of the emulated computations will always differ from those of the native, non-emulated computations by a constant factor. However, a given system may be better suited to emulating some systems than others, and the program required to set up the emulation may be substantially more or less complicated. A rock might serve as both a hammer or a crude knife, but it makes a much better hammer than knife; an actual knife, by contrast, can be improvised to a wide variety of very practical purposes. The same is undeniably true of computational systems; although the Rule 110 automaton can emulate a Universal Turing Machine, and that universal Turing Machine can emulate the operation of the latest multi-core processor running your favorite operating system, the time performance of your system would decrease by a very large (but nonetheless constant) factor, and require quite a bit of memory besides. In the same vein, dynamic database access through a webpage makes it relatively easy to steal privileged information from the database because (if the website is badly designed) the user has the chance to pass arbitrary SQL queries to the server, but would be much more difficult (by itself) to leverage into an attempt to seize control of the operating system kernel.

Malware, then is just software coerced into emulating an unwanted computation; attack vectors are essentially just abstract buses over which the victim machine receives instructions from its attacker; exploits are essentially programs running on a maliciously purposed abstract machine. This is, of course, all highly speculative, but it seems to give an expressive language in which to formulate many of the problems of security, and to tie together many well-developed branches of computer science.




[1] Buchanan, Erik, Ryan Roemer, and Stefan Savage. "Return-Oriented Programming: Exploits Without Code Injection". Presented at Black Hat 2008, slides available here

[2] Goguen, J. A. and J. Meseguer. "Security Policies and Security Models". IEEE Symposium on Security and Privacy, 1982.

[3] Landwehr, Carl E., Alan R. Bull, John P. McDermott and William S. Choi. "A Taxonomy of Computer Program Security Flaws, with Examples". ACM Computing Surveys, 26:3, September 1994.

[4] McCullough, Daryl. "Noninterference and the Composability of Security Properties". IEEE Symposium on Security and Privacy, 1988.

[5] Minsky, Marvin. "Size and Structure of Universal Turing Machines". Recursive Function Theory, Proceedings of the Symposium in Pure Mathematics, 5, American Mathematical Society 1962.

[6] Wolfram, Stephen. "A New Kind of Science". Wolfram Media, 2002.

[7] Wulf, William A. and Anita K. Jones. "Reflections on Cybersecurity". Science, vol. 326, 13 November 2009.

Sunday, January 31, 2010

"The Best Kind of Student Goes and Practices It Assiduously"

Lao Tzu said that when the best kind of student hears about the Way, he goes and practices is assiduously; when the worst kind of student hears about the Way, he laughs in contempt. This is a good statement about learning in general, and what it means to effectively apply one's self to a study -- any study, and every study.

In order to really learn something, you have to really truly make it a part of your self. This is a fine sentiment, except that 'self' itself is such a vague and illusive concept, and so talk of adding parts and pieces to such a thing quickly descends into confusion. Is something a part of yourself because you wish for it? Because you think about it? Because you attribute it to yourself? Because someone else attributes it to you? How much is enough, and how little is not? Can you know it when you see it? The boundaries of the self are so hazy that the metaphor of taking things from the outside and putting them inside simply does not work. Learning isn't an acquisition.

This is what makes Lao Tzu's attributed utterance profound: the best kind of student is the best for the simple reason that he goes and practices, in all the senses of that word. Learning means putting into practice, and what you choose to put into practice becomes a seamless part of the activity that is your life. Learning is doing.

There is a subtlety here, though. When you value you something, you keep it in mind; you don't set aside or casually forget about people you love, ideals you treasure, nor your own certainly your own goals and survival. When any of these things come up, you remember them, and you act in a way that accords with them. Learning is no different.

Hence the importance of the latter part of the saying; the worst kind of student hears about the Way and laughs in contempt. I say this having done things in just this way, many times in the past, and having utterly failed in such cases. This is the acquisitive approach to learning, the one that suppose that the facts are set in place and it is only a matter of taking them and putting them inside of one's brain. When you come out and say it this way, such an attitude sounds utterly false; everybody knows that you have to practice something to get good at it. But if you don't know what it is that you're actually doing, then your actions aren't practice. They're wasted effort. It's easy to go out and engage in a flurry of activity and to call it "practice", but what makes for real practice is a sensitivity to the interplay between what you do and what the rest of the world does in reply. If your practice is just the stubborn application of your self-conceived ideas to the situation your happen to be in, you're not learning. You're insisting. Practice acts, but carefully studies the consequence. Learning begins with questioning, and questioning is empty if no attention is paid to the answers.

When something is stated, it seems obvious. When something is done, it seems hard.

In a short comment appearing somewhere in the middle of "The Society of Mind", Marvin Minsky gives an interesting counter to the question of whether machines have souls. "I ask back", he says, "whether souls can learn. It does not seem a fair exchange -- if souls can live for endless time and yet not use that time to learn -- to trade all change for changelessness. And that's exactly what we get with inborn souls that cannot grow: a destiny the same as death, an ending in a permanence incapable of any change and, hence, devoid of intellect." Mr. Minsky's insight is quietly brilliant: learning is growth, and growth is inseparable from life.

Time passes. Situations differ. Nothing produces harmony by itself, and nothing acts by itself.

Assiduous practice is assiduous living. Our lives are nothing other than the lessons learned from a long dialogue between ourselves and our circumstances.

Sunday, December 6, 2009

All Computation Is Effectful

I had the fortunate opportunity to attend ACM's Symposium on Principles of Programming Languages (POPL) '09 earlier this year, including keynote addresses and open panel discussions by some of the field's most prominent and celebrated researchers. One issue that came up over and over again was the difficult problem of how to handle so-called "effects".

The functional programming community typically uses terms such as "effectful computation" or "side effects" to describe a broad class of things a computer program may do at runtime whose consequences may not be readily apparent from inspection of the program text itself. These may include memory references (e.g. as in the notoriously strange pointer semantics of C), I/O, interrupts, exceptions, and message passing. In certain quarters, there is a long history of concern over how to encapsulate these inevitabilities of useful programming within a language that somehow tames their unpredictability. This is no doubt a worthy motive; programs all of whose effects were perfectly and completely evident in their source code would make programming in general much easier and might even open the door to that elusive and often contentious goal of "formal program verification". A very substantial research effort has gone into solving the problem and the ideas put forward, which are far too numerous to survey here, show a dazzling sophistication. Even so, the fact that the problem of how to sensibly express computational effects is still an active concern of leading researchers is evidence that no work so far has decisively settled the issue.

To understand the difficulty, one must understand the curious notion of "functional purity". Functional programming languages are languages based on the Lambda Calculus, one of the three canonical (and interchangeable) paradigms of universal computation. The Lambda Calculus, originally due to Alonzo Church, expresses computations as the application three basic reduction rules to syntactic objects usually referred to as "lambda terms". Because the Lambda Calculus is a complete model of universal computation, any program that can be executed on a computer can, in theory, be expressed as a term in the calculus, with the "halt state" of the program equivalent in some sense to the fully-reduced form of the lambda term. The basic building block of a lambda term is a "lambda", which is nothing other than a function in the formal mathematical sense of the word "function". That is, a lambda specifies a rule according to which an input value is matched to a specific, well-defined output value. It would be ideal if programs behaved like lambdas, producing a well-defined output for each well-formed input, according to a specific and well-defined rule. Moreover, since lambda terms are composable into larger lambda terms, such programs could be modularly combined, according to traditional software engineering practice, to produce large and useful new programs from smaller, more basic ones, all while preserving the happy property that no program could have more than one output for any given input. This, in essence, is the goal of pure functional programming.

The significance of functional purity is that it leaves no room for unexpected effects. In theory, program execution should proceed according to nothing other than the well-defined reduction rules of the lambda calculus, whence each reduction has exactly one effect, namely, that specified by the appropriate reduction rule. This does not mean that a pure-functional program may not have bugs, only that source of bugs will be restricted to logical errors on the part of the programmer, rather than unexpected interactions between parts of the program. By contrast, a program in a more familiar and more organic language (such as C) may appear superficially correct but cause effects at runtime whose consequences ripple widely through the program with obscure and unintended consequences. However, the more attentive or skeptical reader may object: since any really useful programming language has a well-defined semantics that specifies what any given statement will do, separating a logical error in a pure functional language from a effect-caused bug in an impure language is a distinction without a difference. Any unexpected behavior of a program is a bug, regardless of its origin.

That's not to say that pure functions are not a useful organizing principle. Pure functions capture a basic intuition of how programs are "supposed to" work, producing no more than one possible output for any given input, and doing so according to a clearly specified rule whose deeper implementation mechanics are usually of no interest to the programmer. Moreover, the simple reductions of the lambda calculus make it relatively easy to foresee what a functional program will do, which is a notable contrast to the semantics of non-functional languages which, even though well-defined, may be forbiddingly complicated. It is very telling that even the illustrious Edsger Dijkstra, an unflinching champion of careful and semantically exact program composition, admitted that semantic analysis for even straightforward properties of trivial imperative programs seemed excessively complex[1]. (However, it's also noteworthy that Dijkstra did the analysis anyway.) The idea of a pure functional language certainly has virtues. It is, however, another matter whether these virtues are attainable in practice.

The best-developed and most successful pure functional language yet implemented is Haskell. Haskell enjoys a selection of stable compilers for every major platform, including the Glasgow Haskell Compiler (GHC), which is a commercial-grade compiler boasting numerous useful extensions and the capability to produce native machine code. Programs written in every major implementation of Haskell, however, suffer in most cases from serious performance deficits compared to similar programs in a non-imperative language. Even the official Haskell Wiki notes that "GHC doesn't have any credible competition in the performance department", and suggests that programs written in Haskell may keep pace with counterparts in other languages, but only with very aggressive tweeking and optimization. Haskell depends upon a very complex run-time system that is highly susceptible to memory leaks and greatly complicates formal verification of compiled Haskell code. One might argue, however, that for at least some applications this would be an acceptable price to pay for the straightforward semantics of a lambda calculus. Haskell's purity, however, is in name only.

Arguably, Haskell does not achieve purity at all, but only manages to localize all of its "impurities" to one place. This place is an essential Haskell construct known as the IO monad, where virtually all essential program behaviors take place. In essence, a Haskell program can only make system calls, catch or raise exceptions, or handle interrupts inside the IO monad. This allows the familiar Haskell type "IO a" to act as a wall separating the idyllic garden of pure functional delights made possible by the runtime system from the gritty details of how real programs execute on real machines. One of the chief architects of GHC, Simon Peyton-Jones, famously described the IO monad a giant "sin-bin, used whenever we want to do something that breaks the purely functional paradigm." [2] Peyton-Jones makes a reasonable argument in the same article that simply making the pure-impure distinction is useful in itself, but also acknowledges that contemporary attempts to more completely account for effects prove either too complicated or too inefficient to be practical. Haskell represents the end-product of a tremendous and concerted research effort by a large number of talented people and GHC is surely an impressive technical accomplishment. However, the sheer magnitude of the effort required to achieve even this modest gain toward the language enthusiasts' goal of functional purity makes its shortcomings that much more conspicuous.

There is, I think, a lesson in all this, and that lesson is that there is no promise in trying to capture all the effects. Computers are machines, and machines work via carefully a orchestrated cascade of predetermined physical causes and their expected effects. All computation is effectful computation. I realize that this may be an extremely controversial thing to say, but I feel that it stands on a well-founded principle. The difficulties and idiosyncracies of so-called "effects" all arise from the fact that computers have to be physically constructed, and thus must accommodate the protocols of the circuits that constitute them, must retain their data in some kind of physical memory, and must have some means to communicate with machines and components that are spatially separate. Trying to resist this fact by abstracting away such details is bound to end in abstractions of rapidly increasing complexity and rapidly decreasing practicality.

The motivations for abstraction via programming language are multifaceted and practically compelling. At the same time, not all abstractions are good abstractions. Church's calculus has proven a powerful and useful model of computation, and is theoretically interesting in its own right. However, it is telling that it was Alan Turing's eponymous and much more mechanical "machine" that became the conceptual basis of the first digital computers. The difficulty of a problem often depends upon its phrasing. We can't write programs that consist of causes with no effects. I admit that it's a very broad, very contentious, and very far-reaching claim, but the utter complexity and unusability of attempts so far to account for so-called "computational effects" suggests that perhaps we are trying to answer the wrong questions.




[1] Dijkstra, Edsger. "Notes on Structured Programming." T.H.-Report 70-WSK-03. 1970.

[2] Peyton-Jones, Simon. "Tackling the Awkward Squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell." Microsoft Research, Cambridge. 2001.