From Creationism to Evolutionism in Computer Programming
(note: click Ø in the menu on the lower-right to disable slideshow mode)
Title: | The Programmer's Story: From Über-God to Underdog |
---|---|
Subtitle: | From Creationism to Evolutionism in Computer Programming |
Author: | François-René Rideau, meta.ph/or |
Meeting: | `LispNYC`_, 2014-10-14 |
URL: | http://fare.tunes.org/computing/evolutionism-slides.html |
Programming tools imply a story 'bout who the programmer is;
the stories we tell inspire a corresponding set of tools.
Past progress can be told in terms of such stories;
Future progress can be imagined likewise.
Making the stories explicit is a great meta-tool...
... and it's fun!
Tell stories
Argue Relevance
Discuss Future
Let's start with the beginning,
the simplest, most obvious story to explain
how programs come into existence:
Creationism!
In the beginning the Machine was without form, and void...
...then the Programmer zapped Software into the Machine...
...and the Software was.
The Programmer is a God above and beyond the Machine
Programmer-God has perfect understanding of the Program
Real software is a projection of His perfect platonic idea
Paper on which to write down the perfect program
A switchboard with which to enter the perfect program.
The basis for many a course in "Computer Science"
Works great in small exercises...
... at least for a few clever students.
Software isn't perfect.
Plenty of "bugs" happen.
Perfect program ideas have imperfect implementation.
And so...
... we need to account for them in our story.
And the simplest explanation is:
Some adverse entity introduces bugs, errors, mistakes,
noise in the channel between God and Machine.
To be blamed for imperfections in the Program.
"Cosmic Rays" and other random Memory Corruption
Errors when the program is entered into the Machine
Discrepancies between the perfect idea and the program
Blinkenlights to inspect the contents of memory
Punch cards to record successful program communications
Adhesive Tape to fix punch cards
An antagonist force can spice up any story.
(The game developers in the audience won't disagree.)
The devil is a good story mixin.
Creationism is simple and obvious,
but quickly shows its limits.
And so...
we may improve on it with
our second story:
On the first day, God separated requirements from bugs
On the second day, God drew a flow chart
On the third day, God divided the program into routines
On the fourth day, God wrote the program's kernel
On the fifth day, God coded the application
On the sixth day, God finished the interface
On the seventh day, God released the Software
God still has a perfect eternal Program idea, but
The Machine isn't perfect.
Programming the Machine isn't instantaneous.
And so...
He does it in layers.
Neat hierarchical layers.
Method: Top-down design
Architecture: layered systems
Prototyping: Flow chart diagrams
Process: The waterfall process
Algorithms: Divide and Conquer
Layered languages: Assemblers, Formula Translators
The devil mixin applies.
At each step, the devil introduces bugs to be fixed.
Even at the end of the process, bugs are still there.
And so...
Creation is re-iterated until bugs are gone.
At first, God wrote a prototype: unicellular software
After some work, God released version 1 beta: fish, etc.
Eventually, God released version 1: dinosaur software
Then God released version 2, 3, etc.: as many layers of fossils
At last God has now produced a stable version.
Unless He's working on next patch release.
As you no doubt noticed,
this Layered Creation with a Devil,
or Iterated Creation,
is best known as...
... Intelligent Design!
God first creates simple software.
God frequently improves with more elaborate releases.
More complex structures bootstrapped from simpler ones.
Previous creations are discarded.
Parts remain as fossils.
God is essentially Intelligent
He designs software along hierarchical organization
Design however is neither instantaneous nor perfect
Iterations improve the design
Method: Software Refinement
Architecture: nested layers
Prototyping: Modelling Tools
Process: Design iterations
Scaffolding: Assemblers, Compilers, Compiler-Compilers, Builders
Service Layers: Kernels, Libraries, Daemons
Loggers, tracers and single-steppers to help locate bugs.
Editors to add features and remove bugs (line-based)
Some small amount of reviewing and testing (at the end of each iteration).
Official story amongst software professionals,
probably because it boosts their ego:
they feel intelligent and in control.
Scales to largish programs...
... for well-organized teams of clever people.
Intelligent Design can handle much more complex programs
Better understanding breeds better tools
Tools are both mechanical and social
The Programmer-God is somewhat less of an Über-God
Better understanding also breeds Humility
The same will go for all of my stories
Multiple Programmer-Gods cooperate in creating Software.
Each has his own intents, actions, specialties.
Multiple Gods
Multiple roles of a same God
God changes his mind with time
Files, directories, hierarchical directories
Time-sharing systems, multiple users, simultaneous processes
Communication protocols between multiple machines
Components: software divided in modules, submodules, etc.
Comments, documentation convey intent from God to God
Conferences are given, journals are published.
Alternate groups of godly antagonists (crackers)
Personalities of a schizophrenic God (mental disorder)
Passwords, Access Rights, Backups, Redundancy Checks.
Errata, Pages intentionally left blank.
Sooner or later, the Intelligent Design Story falls short.
The end design of most software is just really bad.
Even ignoring bugs, the development process is quite wasteful.
The initial idea itself is often plain stupid.
And so...
to improve on Intelligent Design, we introduce our third story:
The Programmer-God does iterated layered designs, but
His iterated layers include lots of wasteful dead-ends;
further designs often include regressions.
The whole creation lacks either elegance or efficiency.
Not only is the program implementation imperfect,
God doesn't have a perfect idea of it to begin with.
Neither the ultimate intent or means are clear to Him.
Godly intelligence is a scarce resource.
Errors might be a secondary antagonist effect, but
Nonsense is a first-order protagonist defect.
Interactivity, to bounce ideas: command line, REPL, IDE
Filtering, to eliminate nonsense: systematic sanity checks
Usability, to avoid blunders: idiot-proof interfaces
Online manuals, Interactive help
Precise diagnostic from compilers
Shallow checking: syntax errors, runtime assertions
Simple semantic checking: Types, Contracts
Deeper semantic checking: Model checking
Polytheism: protect gods from each other's failures,
enforce checks and contracts in and between isolated processes.
Devil: testing becomes a systematic need;
Happily, the Devil is just as stupid as the Programmer-God,
to be buried under heavy and complex security features.
The untold story behind much of software engineering,
ever present but never to be made so crudely explicit.
The Programmer-God loses his respectability.
From omniscient, he becomes stupid and ignorant:
partial intelligence, narrow and shallow mind, limited focus
Worse, he suffers from mental disabilities:
impatience, blindness, biases, false beliefs, neuroses, etc.
No shortage of imaginable prosthetic devices
to cope with Godly disabilities.
Whichever way Software is or isn't designed,
Software Lamarckism focuses on
Change in the code base between iterations of software
rather than successive states of the code base.
File versioning, project revision control, configuration management
Diffs, Patches, Merges
Review changes, not the whole code base everytime.
Incremental building and testing.
Now an accepted part of all non-trivial software development.
Doesn't include any proper explanation of how change happens.
A Change in Perspective that suggests new stories about
The Evolution of Software.
Darwin's famous theory applies to Software.
But before we tackle his Natural Selection,
let's focus on simpler views of programs evolve.
And so...
... our fourth Story:
Changes are made that only demand limited understanding.
Some changes prove good, some prove bad.
The Almighty Programmer-God carefully selects the good changes.
His Supernatural Selection impresses a direction upon Evolution:
Progress, at a steady pace.
Programs may be deeper than God can fathom, but
God can intelligently judge good from bad,
promote the good and winnow the bad.
God designs the fitness function.
Declarative programming: specify goals, not means
Algorithms: heuristic search
Prototyping: Rapid Development
Method: experiment to quickly filter ideas
Formal specification of software intent
Formal verification of suspicious software
Many Gods Cooperate towards the selection
Software modules: separate interface from implementation
Forums for developer communities
Some Devils play against positive selection
Software modules: monitor accesses, restrict capabilities
Moderate Forums
Supernatural Selection has traction in loose developer communities
Culminates with the First Cybernetics
Declarative programming
Ever improving explicit knowledge representations
Expert systems to solve complex problems
Combines understanding of natural dynamics of software itself
with faith in the ultimate power of
an intelligent and purposeful programmer god.
The Programmer-God is not that intelligent, remember?
Even distinguishing good and evil is beyond Him.
And so...
just like Unintelligent Design followed Intelligent Design,
we introduce our fifth story:
God may not master how Evolution works,
he may lack omniscience or clairvoyance, but
He intuitively guides Evolution towards Progress.
The fittest programs survive, others die out.
God possesses something, some unspeakable Quality,
some ultimate meaning, some soul.
The direction of progress may not be obvious beforehand,
but progress is clearly recognizable after the fact.
God can compute the fitness function, not understand it.
Randomized algorithms. Simulations.
Statistical analysis. Probabilistic proofs.
Programs fast enough in practice, whatever the theory says.
Weak structures compute despite lack of programmer understanding.
Getting inspiration from existing life forms
Genetic algorithms, connectionist neural networks
Knowledge without an explicit representation
Probabilistically Approximately Correct learning.
Communities gather not just developers, but also users.
Distributed knowledge.
Wisdom of crowds.
Regression test suites.
Cryptographic checksums, signatures, zero-knowledge proofs.
Distributed debugging by users.
Users will eventually favor the better software.
It's Yesterday's Next Big Thing.
Allows for solutions where problems overcome understanding
Can create huge software distributions
Reasonable endeavor, while recognized, is de-emphasized.
What remains when reason is gone is plain mysticism.
And so...
we can now discuss what Darwinism really is
in our sixth story:
There is no God above and beyond the Machine,
no supernatural reason or intent.
Survival is its own tautological fitness function.
In each niche memes survive that best acquire resources.
Random haps and mishaps modify programs.
Systematic statistical biases tautologically favor some memes.
A tautology is something that is tautological.
What survives and reproduces, survives and reproduces.
What doesn't survive or doesn't reproduce, disappears.
All kinds of resources are limited and competed for.
And most importantly...
Programmers are in the same world as Machines.
Natural Selection works at the level of human behaviour.
Human productive time is the ultimate scarce resource.
Programmers and Machines are actors at the same level.
Sure you're unique and different...
Just like everyone else in this machine-eats-machine world.
Not just (un)speakable technical quality matters.
Acquisition of programming resources matters most:
time and focus of proficient programmers.
Economic and social considerations trump technology.
Legal and managerial aspects matter.
The market is ultimately driven by economic costs.
Self-sustaining systems, evolving and competing.
All systems are born small, big systems grow from there.
Keep it working at all time.
Keep it simple: complexity costs.
Forking and merging traditions of humans and machines.
Hardware, software and wetware survive as ecosystems.
Intentful opposing forces are human:
trust networks, economic or legal accountability.
Race between noise and signal,
noise reduction by competition between moderated forums.
Re-create artificial life by unguided evolution.
Emerging behavior from interacting software agents.
Sometimes mentioned, always hard to swallow.
Most actually go by degenerate stories as above.
Down from their pedestal, haughty programmers
can wrestle with muddy reality.
Though no direct solution is offered,
fake solutions are dispelled:
illusions, vain obsessions, unearned authorities.
Life is the ultimate judge, accept no substitutes.
If God exists, then ever since He created the world,
He has just been relaxing, and enjoying the show.
Evolution is not guided by God, it is God's Spectator Sport.
Are you feeling small and alone in a cold wild world yet?
And so...
our seventh story will bring you back some warmth:
If some god is observing, it's not you.
You're no observer outside the fray.
You're an animal thrown in the jungle.
Focusing on available opportunities
What now will make you most productive?
You can sell but an exclusive resource -
Starting with your own time, talent, trustworthiness.
Power of incentives: make cooperation mutually profitable
Division of labor, specialization of tasks.
Competing forms of software licenses, service agreements.
Frauds will waste your time, spam you, scam you, etc.
You must recognize friend from foe, signal from noise.
Either keep on top of the race, or delegate ruthlessly.
Centralization concentrates risks and makes them lethal.
Proprietary software is on a suspended death sentence.
At any time, any surviving Proprietary Software is superior.
But Free Software survives long after the Proprietary one died.
Should you avoid Proprietary Software?
Maybe not, but know the price.
Adopted by Upstart Entrepreneurs - The Underdog.
Spokesperson: Paul Graham?
The game is rigged, but
if you don't play, you can't win.
You can't let nature decide,
you're part of the nature.
This isn't a soulless world -
You're the soul of the world.
The world isn't full of failures -
It's full of opportunities.
You're the entrepreneur of your own life.
From Naive Creationism to Inside view of Natural Selection,
The paradigms evolve and our methods improve with them.
Simpler methods are cheaper.
If you can instantly create the software you need, do!
"There is no such thing as philosophy-free science; there is only science whose philosophical baggage is taken on board without examination." -- Daniel C. Dennett
Discrepancy between Reality and Practice = Blind Spot
Reality differing from Theory = Blind Spot you can't identify
Theory differing from Practice = Blind Spot you can identify
Present Optimism: No Future
Future Optimism: Singularity
Mutation Opportunity: Bootstrapping Intelligence
The Fast Lane: Internal Evolution
"We already know the best paradigm"
Someday might be true, but today?
Progress currently happens at breakneck rate.
"Progress follows a vertical asymptote"
"AI will soon transcend these issues"
But what paradigm will the AI follow?
The buck must stop somewhere.
Survival applies to AIs too.
Scarce Resources, Competition, Cooperation, Incentives...
Praxeology applies to any system of intentful agents.
Comparative Advantage: Humans and AIs will trade, not make war.
The Future can't be predicted.
If I could tell you in detail,
it'd be past, not future.
But here are my best bets...
Understanding human intelligence
Finite Quantum progresses
Bootstrap higher expertise
Evolving declarative metaprograms
Programming as dialogue, not command
External evolution: statically pick a meme, survive or die
Internal evolution: dynamically adopt memes that survive
Fast lane: gear your system to emphasize internal evolution
Avoid autism - evolve in a conversation with the world
TUNES: project for such a system (still vaporware)
Lisp plus: allows internal evolution, metaprogramming
Lisp minus: not declarative, internal evolutions are autistic
Goal: bootstrap declarative metaprograms
Means: invest in conversational internal evolution
Low-hanging fruits: use reflection to drive distributed systems
Since October 2008, I'm now hiring someone full time
to extend Lisp towards the low-hanging fruits of TUNES.
I'm working on XCVB to make Lisp evolution less autistic.
Questions? Comments?
System Message: ERROR/3 (/home/fare/html/computing/evolutionism-slides.rest, line 25); backlink
Unknown target name: "lispnyc".