Tenser, Said the Censor [*]

Dear Readers,

Not long ago, some of you submitted my writings to Hacker News.  I recommend against doing this, if you value your reputation there.

The editors of Hacker News appear to have taken an active dislike to this site.  I don’t care to hazard a guess as to why.  They have begun deleting any link to loper-os.org which rises too high in their automated rankings.  That such a rise could take place without any subterfuge involved is beyond their ability to imagine. Anyone who submits this site to Hacker News or clicks the “up vote” for such a submission risks being regarded as a spam drone serving in my Army of Darkness.  [**]  I know that some of you enjoy participating in that community and would not wish such a thing to happen to you.  You have been warned.

Sincerely,

-Stanislav


[*]   With apologies to Alfred Bester.

[**]   Anyone who can locate an advertisement, donation button, or other instrument of profit on this site shall win my entire yearly marketing budget.

Posted in: Distractions, NonLoper, Reactions by Stanislav 4 Comments

The Performance of Lisp, or Why Bean Counters Need Bigger Bags of Beans

One critic, echoing the voices of thousands, asks:

“Surely if Lisp makes a programmer N times more efficient, then it would be easy to study scientifically. Have there been any studies comparing productivity?

I wish I could reply with the immortal words of Babbage.  But alas I cannot.  Sadly, I can indeed “apprehend the kind of confusion of ideas that could provoke such a question.” It is the confusion which inevitably follows from a bean-counter mentality applied to subjects which are fundamentally alien to it and the culture it has been shaping since the start of the Industrial Revolution.  For instance, take the very word “productivity.”  It is meaningless alone.  One must always ask, productivity at what?  If the productivity in question is in the act of being a pyramid builder following orders and bringing to life the ideas of others, then without question the productivity of many a Lisp programmer is something less than heroic.  This has nothing to do with Lisp, and everything to do with the kind of people who find it appealing.  Now, if we’re talking about productivity at undirected invention, the story of Lisp becomes a very different one.  To the now-scorned Lispers we owe garbage collection, all the roots of the modern GUI, dynamic typing, lexical scope, the very idea of a single-user computer workstation, and countless other innovations which so many people believe to have simply dropped from the sky (or worse yet, to have been invented by the sociopathic hucksters who have managed to weld their names to these marvels through Machiavellian business acumen.)

The Lisp Machine (which could just as easily have been, say, a Smalltalk machine) was a computing environment with a coherent, logical design, where the “turtles go all the way down.” An environment which enabled stopping, examining the state of, editing, and resuming a running program, including the kernel. An environment which could actually be fully understood by an experienced developer.  One where nearly all source code was not only available but usefully so, at all times, in real time.  An environment to which we owe so many of the innovations we take for granted. It is easy for us now to say that such power could not have existed, or is unnecessary. Yet our favorite digital toys (and who knows what other artifacts of civilization) only exist because it was once possible to buy a computer designed specifically for exploring complex ideas.  Certainly no such beast exists today – but that is not what saddens me most.  Rather, it is the fact that so few are aware that anything has been lost.

It is indeed possible to measure the productivity of Lisp – just as it is possible to measure the productivity of, say, the scientific method.  You would not attempt to weigh the latter by setting up a gladiatorial match between stereotypical African shamans and stereotypical American physicists (randomly plucked from Los Alamos, say.)  Yet there is no end to similar suggestions for measuring the value of programming systems.  I am no mystic, and believe that productivity could in principle be measured (once you define the word.) However, you must measure it on the time scale where it is relevant. The productivity of inventors and the tools of invention cannot be measured in the same manner as the efficiency of two competing pieces of construction equipment – especially not in a society which routinely deprives inventors of the fruits of their labor and awards everything to the slick and hypersocialized.

Yes, my dear bean counters, you can measure productivity.  I would no more ask you to stop in your attempts at its measurement than I would ask mosquitoes to stop sucking blood.   You can measure productivity – even of Lisp; even of political philosophies.  You will simply need to secure a very large bag of beans – one deep enough to hold a bean for every twist and turn of a century of tinkering, politicking, and everything else associated with the messy business of successfully thinking new thoughts.

Posted in: Hot Air, NonLoper, Philosophy by Stanislav 1 Comment

Where Lisp Fails: at Turning People into Fungible Cogs.

A favorite conundrum of many Lisp aficionados is why the language appears to languish in disuse.  Talk of cultural problems, “the library question” (which usually boils down to nonsensical circular reasoning), too many parentheses, and other absurdities simply dances around the blindingly obvious explanation – one which is able to make sense not only of the obscurity of Lisp, but of many other conceptual breakthroughs (such as reflectivity) which threaten to give developers’ minds a “lever to move the whole world.”

Employers much prefer that workers be fungible, rather than maximally productive.

Yes, this holds true even at that most beloved megacorporation citadel of angels:

“One of the reasons I stayed at JPL for twelve years was that I was appalled at what the software industry had become. The management world has tried to develop software engineering processes that allow people to be plugged into them like interchangeable components. The “interface specification” for these “components” usually involves a list of tools in which an engineer has received “training.” (I really detest the use of the word “training” in relation to professional activities. Training is what you do to dogs. What you should be doing with people is educating them, not training them. There is a big, big difference.) To my mind, the hallmark of the interchangeable component model of software engineers is Java. Without going into too many details, I’ll just say that having programmed in Lisp the shortcomings of Java are glaringly obvious, and programming in Java means a life of continual and unremitting pain. So I vowed I would never be a Java programmer, which pretty much shut me out of 90% of all software engineering jobs in the late 90’s. This was OK since I was managing to put together a reasonably successful career as a researcher. But after Remote Agent I found myself more and more frustrated, and the opportunity to work at Google just happened to coincide with a local frustration maximum. One of the reasons I decided to go work for Google was that they were not using Java. So of course you can guess what my first assignment was: lead the inaugural Java development at the company… The interchangeable component model of software engineers seemed to work reasonably well there. It’s just not a business model in which I wish to be involved, at least not on the component-provider side.”

Erann Gat, “Lisping at JPL”

It amazes me just how blindly complacent programmers have been in the face of the ongoing and very successful deskilling of their profession.  Instead of rebellion, we see mass Stockholm Syndrome.  There is no shortage of pundits ready to bloviate at nauseating length on nearly every – even the most trifling – perceived shortcoming of Lisp [1], other than this one.  Once in a very long while, some daring soul will call out the “elephant in the kitchen” openly and directly:

“…in contrast, the C/C++ approach is quite different.  It’s so damn hard to do anything with tweezers and glue that anything significant you do will be a real achievement.  You want to document it.  Also you’re liable to need help in any C project of significant size; so you’re liable to be social and work with others.   You need to, just to get somewhere.  And all that, from the point of view of an employer, is attractive. Ten people who communicate, document things properly and work together are preferable to one BBM hacking Lisp who can only be replaced by another BBM (if you can find one) in the not unlikely event that he will, at some time, go down without being rebootable.”

Mark Tarver, “The Bipolar Lisp Programmer”

I predict that no tool of any kind which too greatly amplifies the productivity of an individual will ever be permitted to most developers.  In this they shall follow in the maximally deskilled assembly-line footsteps of their grandparents.  “They’ll time your every breath.” As for the “free software” world, it eagerly opposes industrial dogmas in rhetoric but not at all in practice.  No concept shunned by cube farm hells has ever gained real traction among the amateur masses. [2]


[1] Ever wonder why it is customary to speak of the wildly different Common Lisp, Scheme, ZetaLisp, Emacs Lisp, etc. as though they were a single language? I would like to suggest that we start referring to C/C++, Java, Python, etc as ALGOL.

[2] Consider Linux: the poster child of successful free software.  It is a knockoff of a 1970s operating system well past its sell-by date. This is because a herd simply cannot innovate, whether for fun or for profit. Every innovative work of mankind has been the product of one – sometimes two, rarely three – minds.  And never the work of a herd.  No mathematical theorem, no enjoyable novel, no work of art of any importance, have ever been produced by a herd.   I fail to see why innovative software ought to play by a different set of rules.

Posted in: Hot Air, NonLoper, Philosophy by Stanislav 17 Comments

You have made your bedrock, now lie in it.

As a child, I was quite fond of old-fashioned Lego bricks.  One very endearing but rarely discussed property of such bricks is their durability, bordering on the indestructible.  Almost any abuse inflicted on a Lego structure will, at worst, leave you with a pile of bricks entirely like the one you started with.  Even the most baroque Lego edifice will always break into Legos, and not jagged shards of plastic.  In my childhood, this felt like something approaching an elementary physical law.  As with many real physical laws, it applies in a restricted (though usefully broad) domain: a Lego castle dropped from the Empire State Building or crushed in a garbage compactor will leave behind many pieces still recognizable as Legos, and almost certainly a few which are not.  However, in my childhood I did not have ready access to garbage compactors or the roofs of tall buildings, and so the Lego brick seemed like an impregnable elementary particle: a bedrock abstraction.

bedrock abstraction level is found in every man-made system.  No recoverable failure, no matter how catastrophic, will ever demand intelligent intervention below it.  Repair at those depths consists purely of physical replacement. [1]  No car crash, however brutal, will ever produce piles of loose protons and neutrons.  When a Unix binary crashes, it might leave behind a core dump but never a “logic gate dump” and certainly not a “transistor dump.”  Logic gates and transistors lie well below the bedrock abstraction level of any ordinary computer. [2]

The computers we now use are descended from 1980s children’s toys.  Their level of bedrock abstraction is an exceedingly low one.  This would be acceptable in a micro with 64K of RAM, but when scaled up to present proportions it is a nightmare of multi-gigabyte bloat and decay. Witness, for instance, the fabled un-debuggability of multi-threaded programs on today’s architectures.  It stems purely from the fact that truly atomic operations can only exist at the bedrock level, and to fully comprehend what is going on in the entire machine requires wading though a vast sea of binary soup, boiled and stirred continuously by an asynchronous world.  The futility of this task is why programmers aren’t usually given even a sporting chance – observe the lack of a hardware debugger in any modern computer.

Once in a while, barring a whiff of the proverbial magic blue smoke, a hardware-level malfunction makes itself known through a fit of non-deterministic behavior in that rare bird, a piece of known-good software. Yet, to a first approximation, solid state hardware will spend years doing exactly what it says on the box, until this hour comes.  And when it has come, you can swap out the dead parts and be guaranteed correctness again.

Software, on the other hand, routinely ships broken.  And software cannot be meaningfully repaired or replaced, only re-designed.  Yet witness the cries of righteous outrage among software vendors whenever hardware deviates ever so slightly from its advertised function.  What software company could honestly lay claim to even the lowliest silicon pusher’s levels of bug-free operation and architectural soundness?  I cannot help but picture a stereotypically slick and unrepentant con artist, frothing with rage after having been duped into purchasing a costly full page ad in what turned out to be a Skeptic society’s periodical.  It appears that Microsoft (and now Apple) is entitled to comfortable and stable bedrock abstractions, while you and I are not.

I sometimes find myself wondering if the invention of the high-level compiler was a fundamental and grave (if perhaps inevitable) mistake, not unlike, say, leaded gasoline.  No one seems to be talking about the down-side of the compiler as a technology – and there certainly is one.  The development of clever compilers has allowed machine architectures to remain braindead.  In fact, every generation of improvement in compiler technology has resulted in increasingly more braindead architectures, with bedrock abstraction levels ever less suited to human habitation.

Nevertheless, high-level architectures still developed, though most were strangled at birth by political forces.  Think of where we might be now, if the complexity of programming a computer had been ruthlessly pruned at the source, rather than papered over with clever hacks.  Dare to imagine a proper computer – one having an instruction set isomorphic to a modern high-level programming language.  Such a machine would never dump the programmer (or user) by surprise into a sea of writhing guts the way today’s broken technologies do.  Dare to imagine a computer where your ideas do not have to turn into incomprehensible soup before they can be set in motion;  where there is, in fact, no soup of any kind present in the system at all.  It would be a joy to behold.

I posit that a truly comprehensible programming environment – one forever and by design devoid of dark corners and mysterious, voodoo-encouraging subtle malfunctions – must obey this rule:  the programmer is expected to inhabit the bedrock abstraction level. And thus, the latter must be habitable.

Notes

[1] Note that the converse does not hold: human ingenuity has gifted us with systems which break far above the bedrock abstraction level, yet are still not meaningfully repairable.  Witness any piece of electronics with buggy firmware, where the latter is non-flashable or the manufacturer is defunct (or unwilling to patch.)

[2] A system implemented on an FPGA, or built from the once-ubiquitous bit-slice logic chips would have a much lower level of bedrock abstraction.  However, it is worth noting that a modern FPGA architecture is somewhat less fine-grained than the “sea of gates” imagined by the novice hardware description language programmer.  An FPGA aficionado is still living in another’s universe, and it isn’t necessarily one where each and every constraint imposed on you makes sense – certainly if you lack the closely guarded architectural manuals.

The Nook, the Cranny, and the Lend Me Not.

The Nook, Barnes & Noble’s answer to Amazon’s Kindle, was greeted with fanfare for including a feature which allows users to “lend” a purchased book to anyone, with a guarantee of recovering it later. The first announcement I came across mentioned no other rules governing the lending process. My first thought was that such an option is essentially a loophole – one which would allow almost anyone to circumvent payment for more-or-less unlimited access to almost anything in the Nook catalog, and that this lending feature is (or soon will be) severely crippled, lest the hole expand to highway size and a mockery be made of the very concept of artificial scarcity.

A simple thought experiment is in order. Let’s pretend that a Nook book (or any similar DRM’d ebook) could be lent in exactly the same manner as a physical book: to whomever you like, whenever you like, for as long as you like – with the added benefit of instantaneous, guaranteed, and toll-free shipping in both directions. This suggests that one could set up a library – a perfectly legal thing to do with physical books. The library (let’s call it Cranny) would consist of an online service which automates the process of requesting a Nook book from anyone who owns a copy but isn’t reading it at the moment. It would also allow you to send a request to recover any of the books you have lent out, with the same speed and ease. Consider: how many of the physical books on your shelves are you currently reading? In the course of any given hour? day? week? month? There is no reason to suppose that this situation would be any different for electronic books. The result: once a Nook book has been purchased by some critical number of Cranny users, just about all future readers would be able to enjoy it for free, with the aid of a vast global library. In fact, the entire process of pretending that a limited number of copies of a work exist (with the resulting need to ration access) becomes a farce. The Cranny scenario is clearly unacceptable to B&N, and (unsurprisingly) they have crippled the Nook’s lending mechanism to prevent it – just as I predicted upon first hearing of the device. It turns out that a Nook purchase can only be lent once. Here is where things become interesting.

I believe that the Nook may very well relive the fate of Microsoft’s Zune, which allowed users to exchange songs via a WiFi connection – with a play count strictly limited by DRM hardware, even under protest of the copyright owner (say, for files licensed under Creative Commons.) I cannot help but suspect that this ill-conceived anti-feature contributed to the Zune’s unimpressive sales. A feature that is prominently crippled is worse than a nonexistent one, in that users are made vividly aware of frustrated possibilities – all the more so when the prohibited act is one which is entirely traditional with respect to the electronic medium’s low-tech predecessor (whether it be CDs or dead trees.) The Nook’s lending mechanism is an ill-conceived attempt to mimic the behavior of physical books – no doubt in hopes of persuading customers to pay a physical book’s price for mere bits. The latter seems to be an incurable, lethal (witness NuvoMedia plus a parade of other corpses) obsession of ebook publishers.

My prediction: the best-case scenario from B&N’s point of view would be that users simply forget that the lending mechanism exists at all. If, on the other hand, large numbers attempt to use it, waves of frustration will spread. The odiousness of a DRM restriction is not proportional to the absolute amount of freedom it removes; rather, it is a function of just how often and how painfully it thwarts a previously-commonplace (or otherwise natural) act which occurs regularly to most users (in this case, the dastardly deed of lending out a book more than once in its lifetime.) If DRM vendors were anything other than snake-oil hucksters, this fact would be common knowledge.

If DRM-crippled e-books were advertised as being exactly what they are – cheap, inferior, remotely-censorable imitations of actual books – their existence and growing popularity would not be a cause for concern. However, publishers understand that the freedoms traditionally enjoyed by book owners (such as the freedom to lend without restriction) will ultimately lead to the collapse of their business model – and so, they will persist indefinitely in their attempts to make water not wet. I invite the uninitiated to explore what the act of reading would look like were these freedoms to be lost entirely. (When the latter piece was written, the now-commonplace DRM-laden single-use textbooks were still a dystopian fantasy. Students – the perfect captive audience – are the canary in the copyright coal mine.)

Posted in: Distractions, Hardware, NonLoper, books by Stanislav No Comments

Secrets of the Symbolics Console: Part 2

Let’s take another look at the console. There are several boards inside, but this is the only one which deals in custom Symbolics protocols (as opposed to the widely-known intricacies of operating a black-and-white CRT.)

console controller board

The rough annotations are my own. Click on the pictures for super-size (~10MB!) images.

Once again, the Phase Encoded Video decoder board:

labeled PE decoder board
A: 100131 – Triple D-type Flip-Flops
B: 100102 – Quint 2-Input OR/NOR Gate with Common Enable
C: 100131 – Triple D-type Flip-Flops
D: 100107 – Quint Exclusive OR/NOR Gate
E: 100141 – 8-bit shift register
F: 100114 – Quint Differential Line Receiver
G: 100141 – 8-bit shift register
H: 100131 – Triple D-type Flip-Flops

The labeled chips are Emitter-Coupled Logic (ECL.) This explains the frequency of the video signal – 160MHz, Manchester-coded (80MHz data and clock) an astounding one for any entirely digital process happening in a machine of this vintage.

Now for the sad part: this board is hot-glued to its moorings in several places. Naturally, I could tear it loose, but I imagine that it was secured in this way for a reason. I would prefer to leave it in place, to ensure a working console in the immediate future. And so for now, my reverse-engineering efforts will focus on the transmission line (which I have been spying on through the console’s video repeater port) and the video card of the 3620 machine itself.

Let’s open up the latter. The densely-packed internals look nothing like those of any PC:

The closed portion of the chassis conceals the (full-height ESDI) disk and the Lisp Machine’s massive, exceptionally hungry power supply.

The console I/O board (which I have barbarously called a “video card”) is obscured beneath the rainbow cable visible on the upper left.

Let’s pull it out:

To be continued…

Secrets of the Symbolics Console: Part 1

The machine does indeed power up and run:

genera hello

But this is not enough.

The console is a museum piece. While a Lisp Machine circa 1986 might last for a reasonably long time between repairs, a CRT of the same vintage likely will not. Moreover, it is a pain to have around, even if it were indestructible. Wouldn’t it be nice to have a box which replaces the monstrosity entirely, with jacks to connect a standard VGA monitor, PS/2 mouse, and the beautiful Symbolics keyboard?

This promises to be less than trivial, however.

Here is what we find inside the console:

console top

Let’s examine the console cable:

1.  XMIT- Digital Audio serial data from system to the console
2.  XMIT+ Digital Audio serial data from system to the console
3.  TXD-  Biphase serial from system to console (console serial port)
4.  TXD+  Biphase serial from system to console (console serial port)
5.  RXD-  Biphase serial data from console to system (keyboard)
6.  RXD+  Biphase serial data from console to system (keyboard)
7.  RCV-  Audio Clock
8.  RCV+  Audio Clock
9.  Phase Encoded Video
10.  Video Ground
11.  Serial Ground
12.  Ground
(source)

Hmm, “Phase Encoded Video.”
The single extant repair manual tells us (p. 94-95) where to find the decoder board:

console side

The computational equivalent of three or four Commodore-64 machines languishes here.  There is even a set of debugging toggles and associated LED indicators.  One toggle is labeled “RUN/STOP.”

A closer look at the Phase Encoded Video decoder daughterboard:

So what is “Phase Encoded Video”?  Just another name for Manchester encoding, apparently.
And what does it look like?

My puny 275MHz non-storage scope (circa 1979) groans:

wave

To be continued…

“Lisp, Lisp, Lisp Machine, Lisp Machine is Fun!”

bolix2
bolix3

Complexity is the problem. Count the parts!

Charles Moore, the venerable inventor of FORTH, has this to say regarding the likely-dim future of technology:

Complexity is the problem. Moving it from hardware to software, or vice versa, doesn’t help. Simplicity is the only answer. There was a product many years ago called the Canon Cat. It was a simple, dedicated word processor; done very nicely in Forth. Didn’t succeed commercially. But then, most products don’t. I despair. Technology, and our very civilization, will get more and more complex until it collapses. There is no opposing pressure to limit this growth. No environmental group saying: Count the parts in a hybrid car to judge its efficiency or reliability or maintainability. All I can do is provide existence proofs: Forth is a simple language; OKAD is a simple design tool; GreenArrays offers simple computer chips. No one is paying any attention.”

“Chuck Moore: Geek of the Week” by Richard Morris.

Will anyone listen?

Posted in: SoftwareSucks by Stanislav 3 Comments

Shards of Lost Technology, and the Need for High-Level Architectures.

The modern high-level-language programmer thinks (if he is of the thinking kind) of low-level system architecture as a stubborn enemy, or, at best, a harsh and indifferent force of nature. Anyone who suggests that everyday desktop apps ought to be written directly in a CPU’s native instruction set is viewed as much the same kind of lunatic as someone who brings up swimming as a practical means of crossing the Atlantic on a tourist vacation. Yet, unlike the Atlantic, the ocean of low-level machine ugliness which we perilously cross in our HLL boats is one of our own creation. Un-creating it is far from impossible. It is not even a particularly deep problem.

There are viable alternatives to the present way of building computers. Those in the know sometimes say that today’s dominant architectures are “built to run C.” In order to fully appreciate the truth of this statement, one must put on an archaeologist’s hat and unearth some which were not. There are many interesting lessons we could learn from the ruins of computer architecture’s Age of Exploration. Let’s examine the Scheme-79 chip: the only architecture I know of which was truly elegant inside and out. It eschewed the compromises of its better-known contemporary, the MIT Lisp Machine (and its later incarnations at LMI and Symbolics) – internally microcoded stack machines, whose foundational abstractions differed minimally from those found in today’s CPUs and VMs. The experimental S79 fetched and executed CONS cells directly – and was coupled to a continuously-operating hardware garbage collector. I will not describe the details of this timeless beauty here – the linked paper is eminently readable, and includes enough detail to replicate the project in its entirety. Anyone who truly wishes to understand what we have lost is highly encouraged to study the masterpiece.

Here is one noteworthy tidbit:

“A more speculative approach for improving the performance of our interpreter is to optimize the use of the stack by exploiting the observation that the stack discipline has regularities which make many of the stack operations redundant. In the caller-saves convention (which is what the SCHEME-79 chip implements) the only reason why a register is pushed onto the stack is to protect its contents from being destroyed by the unpredictable uses of the register during the recursive evaluation of a subexpression. Therefore one source of redundant stack operations is that a register is saved even though the evaluation of the subexpression may not affect the contents of that register. If we could look ahead in time we could determine whether or not the register will retain its contents through the unknown evaluation. This is one standard kind of optimization done by compilers, but even a compiler cannot optimize all cases because the execution path of a program depends in general on the data being processed. However, instead of looking ahead, we can try to make the stack mechanism lazy in that it postpones pushing a register until its contents are about to be destroyed. The key idea is that each register has a state which indicates whether its contents are valuable. If such a valuable register is about to be assigned, it is at that moment pushed. In order to make this system work, each register which may be pushed has its own stack so that we can decouple the stack disciplines for each of the registers. Each register-stack combination can be thought of as having a state which encodes some of the history of previous operations. It is organized as a finite-state automaton which mediates between operation requests and the internal registers and stack. This automaton serves as an on-the-fly peephole optimizer, which recognizes certain patterns of operations within a small window in time and transforms them so as to reduce the actual number of stack operations performed.”

“The SCHEME-79 Chip” (G. J. Sussman, J. Holloway, G. L. Steel, A. Bell)

What we are looking at is a trivial (in retrospect) method for entirely relieving compilers of the burden of stack discipline: a necessary first step towards relieving programmers of the burden of compilers. A systems programmer or electrical engineer educated in the present Dark Age might ask why we ought to demand relief from CPUs which force machine code to “drive stick” in register allocation and stack discipline. After all, have we not correctly entrusted these tasks to optimizing compilers? Should we not continue even further in this direction? This is precisely the notion I wish to attack. Relegating the task of optimization to a compiler permanently confines us to the dreary and bug-ridden world of static languages – or at the very least, makes liberation from the latter nontrivial. So long as most optimization takes place at compile time, builders of dynamic environments will be forced to choose between hobbled performance and the Byzantine hack of JIT compilation.

The instruction set of a properly designed computer must be isomorphic to a minimal, elegant high-level programming language. This will eliminate the need for a complex compiler, enabling true reflectivity and introspection at every level. Once every bit of code running on the machine is subject to runtime inspection and modification by the operator, the rotting refuse heaps of accidental complexity we are accustomed to dealing with in software development will melt away. Self-modification will take its rightful place as a mainstream programming technique, rather than being confined to malware and Turing Tarpit sideshows. Just imagine what kind of things one could do with a computing system unpolluted by mutually-hostile black box code; one which could be understood in its entirety, the way you understand arithmetic. Today’s CPU designers have mind-boggling swaths of silicon real estate at their disposal. Yet they are shackled by braindead architectural dogmas and the market’s demand for backwards-compatibility with a 1970s traffic light controller. This scenario could have been lifted straight from a 1950s science fiction comedy.

The foundations of the computing systems we use are built of ossified crud, and this is a genuine crime against the human mind. How much effort (of highly ingenious people, at that) is wasted, simply because one cannot press a Halt switch and display/modify the source code of everything currently running (or otherwise present) on a machine? How many creative people – ones who might otherwise bring the future to life – are employed as what amounts to human compilers? Neither programmers nor users are able to purchase a modern computer which behaves sanely - at any price. We have allowed what could have once become the most unbridled creative endeavor known to man short of pure mathematics to become a largely janitorial trade; what could have been the greatest amplification of human intellect in all of history – comparable only to the advent of written language – is now confined to imitating and trivially improving on the major technological breakthroughs of the 19th century – the telegraph, telephone, phonograph, and typewriter.

Brokenness and dysfunction of a magnitude largely unknown for centuries in more traditional engineering trades has become the norm in computer programming. Dijkstra believed that this state of affairs is the result of allowing people who fall short of top-notch in conventional mathematical ability into the profession. I disagree entirely. Electronics was once a field which demanded mathematical competence on the level of a world-class experimental physicist. Fortunately, a handful of brilliant minds gave us some very effective abstractions for simplifying electrical work, enabling those who had not devoted their lives to the study of physics to conceive ground-breaking electronic inventions. Nothing of the kind has happened in computing. Most of what passes for widely-applicable abstractions in the field serves only to hamstring language expressiveness and thus to straightjacket cube farm laborers into galley-slave fungibility, rather than to empower the mind by compartmentalizing detail. (OOP is the most obvious example of such treachery.) As for invention, almost everyone has forgotten what genuine creativity in software development even looks like. Witness, for instance, the widespread belief that Linux exemplifies anything original.

I predict that software complexity will eventually cross over the border into the truly unmanageable, and we will begin to see absurdities worthy of Idiocracy. Perhaps this time has already come. I realize that my claim to competence at re-inventing computing from scratch is tenuous at best; yet thus far almost no one else is willing to even contemplate the possibility that we are faced with systemic problems which cannot be solved in any other way, and will continue to worsen.