2015-05-06 07:37:33 +00:00
|
|
|
<title>Mu</title>
|
|
|
|
|
2015-05-26 08:22:00 +00:00
|
|
|
With apologies to <a href='http://en.wikipedia.org/wiki/Mu_%28negative%29#In_popular_culture'>Robert Pirsig</a>:
|
2015-05-06 07:36:32 +00:00
|
|
|
<p>
|
2015-05-26 08:22:00 +00:00
|
|
|
<div style='font-style: italic; margin-left:2em'>
|
|
|
|
Is it a language, or an operating system, or a virtual machine?
|
2015-05-06 07:36:32 +00:00
|
|
|
<p>
|
2015-05-26 08:22:00 +00:00
|
|
|
Mu.
|
|
|
|
</div>
|
2015-05-06 07:36:32 +00:00
|
|
|
|
2015-05-26 08:40:49 +00:00
|
|
|
Read these first: <a href='http://akkartik.name/about'>problem statement</a>,
|
|
|
|
<a href='http://github.com/akkartik/mu#readme'>readme and installation
|
2015-09-07 17:37:27 +00:00
|
|
|
instructions</a> (Mu requires minimal dependencies).
|
2015-05-26 08:40:49 +00:00
|
|
|
|
2015-05-06 07:36:32 +00:00
|
|
|
<p>
|
2015-05-26 08:53:24 +00:00
|
|
|
Mu's code looks quite alien, requiring editors to be specially configured to
|
|
|
|
colorize it in a sane manner. So this page provides links to the source files
|
|
|
|
showing how it currently looks in my <a href='https://github.com/akkartik/mu/blob/master/mu.vim'>custom setup</a>.
|
2015-05-06 07:36:32 +00:00
|
|
|
|
2015-05-26 08:36:13 +00:00
|
|
|
<p>Whetting your appetite: some example programs.
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
<li><a href='html/x.mu.html'>x.mu</a>: a simple program to add two numbers
|
2015-09-07 17:37:27 +00:00
|
|
|
together. Shows that at bottom Mu is a simple VM bytecode designed to convert
|
2015-05-26 08:36:13 +00:00
|
|
|
directly to machine code.
|
|
|
|
<li><a href='html/factorial.mu.html'>factorial.mu</a>: everyone's favorite
|
2015-09-07 17:37:27 +00:00
|
|
|
example, showing how Mu supports conditionals and loops without any special
|
2015-05-26 08:36:13 +00:00
|
|
|
syntax, using the special labels '{' and '}'.
|
|
|
|
<li><a href='html/tangle.mu.html'>tangle.mu</a>: another (contrived) version
|
2015-09-07 17:37:27 +00:00
|
|
|
of factorial showing Mu's ability to 'tangle' code from multiple places into a
|
2015-05-26 08:36:13 +00:00
|
|
|
single function or 'recipe'.
|
|
|
|
<li><a href='html/counters.mu.html'>counters.mu</a>: lexical scope
|
|
|
|
<li>simple examples showing off support for concurrency: <a href='html/fork.mu.html'>fork.mu</a>,
|
|
|
|
<a href='html/channel.mu.html'>channel.mu</a>
|
|
|
|
<li>simple examples showing off hardware control: <a href='html/display.mu.html'>display.mu</a>,
|
2015-07-29 22:55:05 +00:00
|
|
|
<a href='html/console.mu.html'>console.mu</a>.
|
2015-05-26 08:36:13 +00:00
|
|
|
<li><a href='html/screen.mu.html'>screen.mu</a>: example program showing
|
|
|
|
print primitives that inject a screen <em>dependency</em> which can be faked
|
|
|
|
for testing.
|
2015-11-11 05:35:42 +00:00
|
|
|
<li><a href='html/static_dispatch.mu.html'>static_dispatch.mu</a>: example
|
|
|
|
program showing mu's ability to define recipes with headers, and allow recipes
|
|
|
|
with the same name but different headers to coexist.
|
|
|
|
<li><a href='html/chessboard.mu.html'>chessboard.mu</a>: a little program for
|
|
|
|
2 people to play chess, with thorough tests of its behavior including both
|
|
|
|
screen and keyboard handling.
|
2015-05-26 08:36:13 +00:00
|
|
|
</ul>
|
|
|
|
|
2015-09-07 17:37:27 +00:00
|
|
|
Now a listing of every layer in mu. Recall that you can <a href='http://akkartik.name/post/wart-layers'>stop
|
|
|
|
loading at any layer and get a valid program to run with a subset of features,
|
|
|
|
that passes all its tests</a>.
|
|
|
|
|
2015-05-26 08:22:00 +00:00
|
|
|
<p><b>Part I</b>: basic infrastructure
|
|
|
|
<p/><a href='html/000organization.cc.html'>000organization.cc</a>: the basic
|
|
|
|
skeleton program. Compiles and runs but doesn't do much. Later <em>layers</em>
|
|
|
|
hook into this skeleton to add functionality. Mu's guarantee: you can <a href='http://youtube.com/watch?v=c8N72t7aScY'>load
|
|
|
|
features</a> up until any layer, and it will compile and pass all tests until
|
2015-05-26 08:36:13 +00:00
|
|
|
that point. <a href='http://akkartik.name/post/wart-layers'>More details →</a>
|
2015-05-26 08:22:00 +00:00
|
|
|
<br/><a href='html/001help.cc.html'>001help.cc</a>: just a simple test layer
|
2015-09-07 17:37:27 +00:00
|
|
|
to show how to hook into the skeleton. Also summarizes how to invoke Mu,
|
2015-05-26 08:22:00 +00:00
|
|
|
behaviors that later layers will be providing.
|
2015-09-07 17:37:27 +00:00
|
|
|
<br/><a href='html/002test.cc.html'>002test.cc</a>: Mu's minimalist test
|
2015-05-26 08:22:00 +00:00
|
|
|
harness, relying on a couple of one-liners in the makefile to autogenerate
|
|
|
|
lists of tests to run.
|
|
|
|
<br/><a href='html/003trace.cc.html'>003trace.cc</a>: support for logging
|
|
|
|
facts about our program, and for <a href='http://akkartik.name/post/tracing-tests'>checking the facts logged in tests</a>.
|
|
|
|
(<a href='html/003trace.test.cc.html'>tests for the test harness</a>)
|
|
|
|
|
2015-09-07 17:37:27 +00:00
|
|
|
<p><b>Part II</b>: the Mu virtual machine, designed to compile easily to
|
2015-05-26 08:22:00 +00:00
|
|
|
machine language.
|
|
|
|
<p/><a href='html/010vm.cc.html'>010vm.cc</a>: core data structures: recipes
|
|
|
|
(functions), instructions and reagents (operands).
|
|
|
|
<br/><a href='html/011load.cc.html'>011load.cc</a>: the textual representation
|
|
|
|
of recipes and how it's turned into the data structures.
|
2015-09-07 17:37:27 +00:00
|
|
|
<br/><a href='html/012transform.cc.html'>012transform.cc</a>: after Mu
|
2015-05-26 08:22:00 +00:00
|
|
|
programs are loaded but before they are run they can be transformed in an
|
2015-09-07 17:37:27 +00:00
|
|
|
extensible manner akin to lisp macros. Think of this as the core of Mu's
|
2015-05-26 08:22:00 +00:00
|
|
|
‘compiler’ for providing high-level features atop the core.
|
2015-11-11 05:35:42 +00:00
|
|
|
<br/><a href='html/013update_operation.cc.html'>013update_operation.cc</a>:
|
|
|
|
our first transform: check for unknown recipes before the program runs.
|
|
|
|
<br/><a href='html/014literal_string.cc.html'>014literal_string.cc</a>: extend
|
2015-05-26 08:22:00 +00:00
|
|
|
the loader to support literal strings in various instructions.
|
2015-11-11 05:35:42 +00:00
|
|
|
<br/><a href='html/015literal_noninteger.cc.html'>015literal_noninteger.cc</a>:
|
2015-05-26 08:22:00 +00:00
|
|
|
extend the loader to support non-integer numbers.
|
2015-09-07 17:37:27 +00:00
|
|
|
<br/><a href='html/020run.cc.html'>020run.cc</a>: executing Mu recipes by
|
2015-11-11 05:35:42 +00:00
|
|
|
executing the list of instructions they contain. Future layers will define
|
|
|
|
more primitive operations that can be used in instructions.
|
|
|
|
<br/><a href='html/021check_instruction.cc.html'>021check_instruction.cc</a>:
|
|
|
|
harness for adding per-primitive checks to run before running a program.
|
|
|
|
<br/>Various primitive operations: on <a href='html/022arithmetic.cc.html'>numbers</a>,
|
|
|
|
<a href='html/023boolean.cc.html'>booleans</a>, for <a href='html/024jump.cc.html'>control flow</a>,
|
|
|
|
and <a href='html/025compare.cc.html'>comparing values</a>.
|
|
|
|
<br/><a href='html/029tools.cc.html'>029tools.cc</a>: various primitive
|
|
|
|
operations to help with testing and debugging.
|
2015-05-26 08:22:00 +00:00
|
|
|
|
2015-11-11 05:35:42 +00:00
|
|
|
<p/><a href='html/030container.cc.html'>030container.cc</a>: Mu supports
|
|
|
|
compound types akin to records, structs or classes.
|
2015-05-26 08:22:00 +00:00
|
|
|
<br/><a href='html/031address.cc.html'>031address.cc</a>: adding and removing
|
2015-09-07 17:37:27 +00:00
|
|
|
layers of indirection to Mu data.
|
|
|
|
<br/><a href='html/032array.cc.html'>032array.cc</a>: all Mu data structures
|
2015-05-26 22:16:36 +00:00
|
|
|
are bounds-checked.
|
2015-07-12 07:11:56 +00:00
|
|
|
<br/><a href='html/033exclusive_container.cc.html'>033exclusive_container.cc</a>: tagged unions or sum types.
|
|
|
|
<br/><a href='html/034call.cc.html'>034call.cc</a>: calls to recipes look
|
2015-05-26 08:22:00 +00:00
|
|
|
just like primitive operations.
|
2015-07-12 07:11:56 +00:00
|
|
|
<br/><a href='html/035call_ingredient.cc.html'>035call_ingredient.cc</a>: how
|
2015-05-26 08:22:00 +00:00
|
|
|
recipes pass arguments or 'ingredients' without introducing any syntax and
|
|
|
|
breaking the metaphor of recipes as lists of instructions.
|
2015-07-12 07:11:56 +00:00
|
|
|
<br/><a href='html/036call_reply.cc.html'>036call_reply.cc</a>: recipes can
|
2015-05-26 08:22:00 +00:00
|
|
|
return arbitrary numbers of values to their callers.
|
2015-07-12 07:11:56 +00:00
|
|
|
<br/><a href='html/037recipe.cc.html'>037recipe.cc</a>: passing recipes around
|
|
|
|
as first-class values in higher-order functions.
|
2015-05-26 08:22:00 +00:00
|
|
|
<br/><a href='html/038scheduler.cc.html'>038scheduler.cc</a>: running multiple
|
|
|
|
recipes concurrently using <em>routines</em> that might execute in interleaved
|
|
|
|
fashion.
|
|
|
|
<br/><a href='html/039wait.cc.html'>039wait.cc</a>: primitives for
|
|
|
|
synchronization between routines.
|
|
|
|
|
|
|
|
<p><b>Part III</b>: transforms to provide 80% of the benefits of high-level
|
|
|
|
languages.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/040brace.cc.html'>040brace.cc</a> and
|
2015-11-11 05:35:42 +00:00
|
|
|
<a href='html/041jump_target.cc.html'>041jump_target.cc</a>: how Mu provides
|
2015-05-26 08:22:00 +00:00
|
|
|
structured goto-less programming without introducing the syntax of
|
|
|
|
conditionals and loops other languages require.
|
2015-09-07 17:37:27 +00:00
|
|
|
<br/><a href='html/042name.cc.html'>042name.cc</a>: how Mu transforms variable
|
2015-05-26 08:22:00 +00:00
|
|
|
names to raw memory addresses.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/043new.cc.html'>043new.cc</a>: rudimentary memory
|
2015-09-07 17:37:27 +00:00
|
|
|
allocator that is aware of all global types in any Mu program.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/044space.cc.html'>044space.cc</a>: how variables in
|
2015-05-26 08:22:00 +00:00
|
|
|
different routines are isolated from each other using <em>spaces</em>. Mu
|
|
|
|
‘local variables’ are allocated on the heap.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/045space_surround.cc.html'>045space_surround.cc</a>:
|
2015-05-26 08:22:00 +00:00
|
|
|
Chaining spaces together to accomodate variables with varying lifetimes and
|
|
|
|
ownership properties.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/046closure_name.cc.html'>046closure_name.cc</a>: how spaces
|
2015-05-26 08:22:00 +00:00
|
|
|
can implement lexical scope.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/047global.cc.html'>047global.cc</a>: support for 'global'
|
|
|
|
variables that are always available inside a single routine. Mu has no
|
|
|
|
variables that are available transparently across routines.
|
2015-11-11 05:35:42 +00:00
|
|
|
<br/><a href='html/048check_type_by_name.cc.html'>048check_type_by_name.cc</a>:
|
|
|
|
a simple transform to deduce missing types in instructions on the basis of
|
|
|
|
previous instructions in the same recipe.
|
2015-09-07 17:37:27 +00:00
|
|
|
<br/><a href='html/050scenario.cc.html'>050scenario.cc</a>: Mu's first syntax
|
2015-07-29 22:55:05 +00:00
|
|
|
— not for code but for tests. (<a href='html/051scenario_test.mu.html'>example</a>)
|
|
|
|
<br/><a href='html/052tangle.cc.html'>052tangle.cc</a>: support for layers in
|
2015-09-07 17:37:27 +00:00
|
|
|
Mu programs. They've been so good to us.
|
2015-11-11 05:35:42 +00:00
|
|
|
<br/>Support for <em>shape-shifting</em> or generic data structures that can
|
|
|
|
contain <em>type ingredients</em>: <a href='html/054dilated_reagent.cc.html'>054dilated_reagent.cc</a>,
|
2015-11-13 17:58:00 +00:00
|
|
|
a new syntax for allowing whitespace in types; <a href='html/055parse_tree.cc.html'>055parse_tree.cc</a>,
|
|
|
|
a new syntax for representing complex types as trees using whitespace and
|
|
|
|
parentheses (s-expressions); <a href='html/056recipe_header.cc.html'>056recipe_header.cc</a>,
|
|
|
|
a new syntax for introducing ingredients and products with the name of a reagent;
|
|
|
|
<a href='html/057static_dispatch.cc.html'>057static_dispatch.cc</a>, allowing
|
|
|
|
multiple variants of a recipe to coexist with support for different headers;
|
2015-11-11 05:35:42 +00:00
|
|
|
<a href='html/058shape_shifting_container.cc.html'>058shape_shifting_container.cc</a>,
|
|
|
|
a new syntax for wildcard <em>type ingredients</em> in containers; and finally
|
|
|
|
<a href='html/059shape_shifting_recipe.cc.html'>059shape_shifting_recipe.cc</a>,
|
|
|
|
support for type ingredients in recipes. Everytime you call a shape-shifting
|
|
|
|
recipe with a new set of types for its type ingredients, it creates a
|
|
|
|
new variant of the recipe for you matching those types.
|
|
|
|
<p/><a href='html/098check_type_pointers.cc.html'>098check_type_pointers.cc.html</a>:
|
|
|
|
After all our messing about with types, a final pass to make sure we didn't
|
|
|
|
introduce any invalid types.
|
|
|
|
<br/><a href='html/999spaces.cc.html'>999spaces.cc.html</a>: Maps summarizing
|
|
|
|
various address spaces in the core, and the conventions that regulate their
|
|
|
|
use in previous layers.
|
2015-09-07 17:37:27 +00:00
|
|
|
various address spaces in the core, and the conventions that regulate their
|
|
|
|
use in previous layers.
|
2015-05-26 08:22:00 +00:00
|
|
|
|
|
|
|
<p><b>Part IV</b>: beginnings of a standard library
|
2015-09-07 17:37:27 +00:00
|
|
|
<p/><a href='html/060string.mu.html'>060string.mu</a>: strings in Mu are
|
|
|
|
bounds-checked rather than null-terminated. They're also unicode-aware (code
|
|
|
|
points only; no control characters, no combining characters, no normalization).
|
|
|
|
<br/><a href='html/061channel.mu.html'>061channel.mu</a>: channels are Mu's
|
2015-05-26 08:22:00 +00:00
|
|
|
only synchronization primitive, queues that can cause the routine reading or
|
|
|
|
writing from them to stall without taking up CPU resources.
|
|
|
|
<br/><a href='html/062array.mu.html'>062array.mu</a>
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/063list.mu.html'>063list.mu</a>: linked lists where each
|
|
|
|
node points to the next, permitting fast insertion/deletion but slow for
|
|
|
|
search.
|
2015-05-26 08:22:00 +00:00
|
|
|
<br/><a href='html/064random.cc.html'>064random.cc</a>
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/065duplex_list.mu'>065duplex_list.mu</a>: doubly linked
|
|
|
|
lists that can be traversed both forwards and back.
|
|
|
|
<br/><a href='html/066stream.mu'>066stream.mu</a>: data structure to
|
|
|
|
efficiently append strings.
|
2015-05-26 08:22:00 +00:00
|
|
|
|
2015-09-07 17:37:27 +00:00
|
|
|
<p><b>Part V</b>: Nascent tools for browsing Mu codebases, and for teaching
|
2015-05-26 08:37:44 +00:00
|
|
|
programming to non-programmers by getting them hooked on the value of tests.
|
2015-05-26 09:05:46 +00:00
|
|
|
The eventual goal is <b>an environment that watches programmers as they
|
|
|
|
manually test their code, and turns these interactive sessions into
|
|
|
|
reproducible test scenarios.</b>
|
2015-05-26 08:22:00 +00:00
|
|
|
|
|
|
|
<p/><a href='html/070display.cc.html'>070display.cc</a>: primitives for using
|
|
|
|
the keyboard and screen.
|
|
|
|
<br/><a href='html/071print.mu.html'>071print.mu</a>: helpers that can swap
|
|
|
|
the real screen with fake ones for testing.
|
|
|
|
<br/><a href='html/072scenario_screen.cc.html'>072scenario_screen.cc</a>:
|
|
|
|
writing tests that check what is printed to screen.
|
|
|
|
(<a href='html/073scenario_screen_test.mu.html'>examples</a>)
|
2015-07-18 22:22:49 +00:00
|
|
|
<br/><a href='html/074console.mu.html'>074console.mu</a>: helpers that can
|
|
|
|
swap the real keyboard and mouse with fake ones for testing.
|
|
|
|
<br/><a href='html/075scenario_console.cc.html'>075scenario_console.cc</a>:
|
|
|
|
writing tests for keyboard and mouse using the fakes.
|
|
|
|
(<a href='html/076scenario_console_test.mu.html'>examples</a>)
|
|
|
|
<br/><a href='html/080trace_browser.cc.html'>080trace_browser.cc</a>: a
|
2015-09-07 17:37:27 +00:00
|
|
|
zoomable UI for inspecting traces generated by Mu programs. Allows both
|
2015-05-26 08:22:00 +00:00
|
|
|
scanning a high-level view and drilling down into selective details.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/081run_interactive.cc.html'>081run_interactive.cc</a>:
|
2015-09-07 17:37:27 +00:00
|
|
|
hacky primitives for running Mu code in the programming environment below.
|
2015-07-29 22:55:05 +00:00
|
|
|
<br/><a href='html/082persist.cc.html'>082persist.cc</a>: more hacky
|
2015-09-07 17:37:27 +00:00
|
|
|
primitives for supporting saving/restoring sessions in the Mu programming
|
2015-07-29 22:55:05 +00:00
|
|
|
environment.
|
2015-05-26 08:22:00 +00:00
|
|
|
|
2015-09-07 17:37:27 +00:00
|
|
|
<p>Finally, the programming environment, the first major application in its
|
|
|
|
own directory. Stop loading after each of these layers to get a working
|
|
|
|
version with just fewer features. The <a href='https://github.com/akkartik/mu/blob/master/edit/Readme.md'>readme
|
|
|
|
for the app</a> contains instructions for running it.<br>
|
|
|
|
|
|
|
|
<br/><a href='html/edit/001-editor.mu.html'>edit/001-editor.mu</a>: data
|
|
|
|
structures for a simple text editor widget. Load just this layer to see just
|
|
|
|
the rendering and line-wrapping at work.
|
|
|
|
<br/><a href='html/edit/002-typing.mu.html'>edit/002-typing.mu</a>: support
|
|
|
|
for moving the cursor anywhere with the mouse and typing text in there.
|
|
|
|
<br/><a href='html/edit/003-shortcuts.mu.html'>edit/003-shortcuts.mu</a>:
|
|
|
|
support for various keyboard shortcuts for manipulating text you've typed in.
|
|
|
|
<br/><a href='html/edit/004-programming-environment.mu.html'>edit/004-programming-environment.mu</a>:
|
|
|
|
combining two text editor widgets, one on the left, one on the right.
|
|
|
|
<br/><a href='html/edit/005-sandbox.mu.html'>edit/005-sandbox.mu</a>: support
|
|
|
|
for running mu code in the right-hand widget using code from the left, and
|
|
|
|
displaying results in a <em>sandbox</em> below on the right. You can have
|
|
|
|
multiple sandboxes, and hit F4 to rerun them all at anytime with the latest
|
|
|
|
version of the code on the left side.
|
|
|
|
<br/><a href='html/edit/006-sandbox-edit.mu.html'>edit/006-sandbox-edit.mu</a>:
|
|
|
|
click on the title bar of each sandbox to pop it back into the sandbox editor
|
|
|
|
and make changes to it.
|
|
|
|
<br/><a href='html/edit/007-sandbox-delete.mu.html'>edit/007-sandbox-delete.mu</a>:
|
|
|
|
click on the 'x' in the title bar of a sandbox to delete it.
|
|
|
|
<br/><a href='html/edit/008-sandbox-test.mu.html'>edit/008-sandbox-test.mu</a>:
|
|
|
|
click on the results of a sandbox to turn them green and save the output as
|
|
|
|
golden/expected. Any future changes to the output will then be flagged in red.
|
|
|
|
<br/><a href='html/edit/009-sandbox-trace.mu.html'>edit/009-sandbox-trace.mu</a>:
|
|
|
|
click on code in a sandbox to open up a drawer containing its trace. The trace
|
|
|
|
can be added to using the <span style='font-family:courier,fixed'>stash</span>
|
|
|
|
command.
|
|
|
|
<br/><a href='html/edit/010-warnings.mu.html'>edit/010-warnings.mu</a>:
|
|
|
|
support for rendering warnings on both the left and in each sandbox.
|
|
|
|
<br/><a href='html/edit/011-editor-undo.mu.html'>edit/011-editor-undo.mu</a>:
|
|
|
|
support for undo in the editor widget.
|
2015-05-26 08:22:00 +00:00
|
|
|
|
2015-05-26 08:53:24 +00:00
|
|
|
<hr>
|
|
|
|
|
2015-05-26 08:40:49 +00:00
|
|
|
<p>
|
|
|
|
The zen of mu:
|
|
|
|
<ul>
|
2015-05-26 08:56:01 +00:00
|
|
|
<li>traces, not interfaces
|
|
|
|
<li>be rewrite-friendly, not backwards-compatible
|
|
|
|
<li>be easy to port rather than portable
|
|
|
|
<li>global structure matters more than local hygiene
|
2015-05-26 08:40:49 +00:00
|
|
|
</ul>
|
|
|
|
|
2015-05-26 08:53:24 +00:00
|
|
|
<p>
|
|
|
|
Mu's vision of utopia:
|
|
|
|
<ul>
|
2015-05-27 19:17:49 +00:00
|
|
|
<li>Run your devices in 1/1000th the code.
|
|
|
|
<li>1000x more forks for open source projects.
|
|
|
|
<li>Make simple changes to any project in an afternoon, no matter how large it is.
|
|
|
|
<li>Projects don't slow down with age, they continue to evolve just as fast as
|
|
|
|
when they were first started.
|
|
|
|
<li>All software rewards curiosity, allowing anyone to query its design
|
|
|
|
decisions, gradually learn how to tweak it, try out increasingly radical
|
|
|
|
redesign ideas in a sandbox. People learn programming as an imperceptible side
|
|
|
|
effect of tinkering with the projects they care about.
|
|
|
|
<li><a href='https://www.dreamsongs.com/Files/PatternsOfSoftware.pdf'>Habitable</a> digital environments.
|
|
|
|
<li>A <em>literate</em> digital society with widespread skills for
|
|
|
|
comprehending large-scale software structure and comparing-and-contrasting
|
|
|
|
similar solutions. (I don't think anybody is literate by this definition
|
|
|
|
today. All we can do easily is read our own programs that we wrote recently.)
|
|
|
|
</ul>
|
2015-05-26 08:53:24 +00:00
|
|
|
|
2015-05-26 08:22:00 +00:00
|
|
|
<p style='margin-bottom: 2em'/>
|