![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
This morning I woke up pissed off because Windows rebooted overnight, forever erasing some notes I had. This motivated me to refine my ongoing manifesto, so it could be LJed. The ideas here are obvious, but it looks like they have escaped pretty much EVERYBODY who ever designed large computing systems.
I used to dream of starting a system from scratch, and writing all my programs for my system, so that over time it would develop into an optimized environment for its user (i.e. me). For a while, I had faith that Linux with all its open-source goodness, had done that most of the work for me, and all I would have to do was implement my ideas. Unfortunately, I never became well-versed enough with the system to find out if that was going to be possible. A year or two ago, I ran into the TUNES website, and realized that I wasn't the only one with a dream. In fact, these guys have been way ahead of me for a long time. Anyway, I think it's a good idea to write down *MY REASONS* for wanting a different approach to human-serving cybernetic systems (i.e. personal computers).
If you know of any systems implementing my ideas or solutions to any of my concerns on a Windows platform, please leave a comment. My goals fall short of Faré's goals. (btw, this website is definitely worth checking). Faré actually calls his ideal "computing liberalism" (in the sense of "libertarianism"), and accuses present systems of computing statism / conservatism, but I fail to see the analogy.
How computing systems should be, but aren't:
User control over the machine
All I want is to be able to access all inputs and outputs of my machine, with suitable abstractions. This shouldn't be too hard, as there already exist thousands of drivers out there for most data media, both input and output. Yet, it never seems trivial for the programmer to access these ports. Many of my frustrations have had to with finding graphics and sound libraries for different languages.
Programs should be written flexibly
As a rule, analysts and programmers can't predict how their users will want to use their system. People who spend a lot of time using the same program end up becoming experts at it, but at the same time, they eventually run into a wall, and can't improve their efficiency further. This is when they start noticing the limitations of the program. Thus, programs should be written in fine-grained open-source modules, so that they can be easily customized. Compilation and packaging shouldn't protect users from acessing internal functions of a program. The user should be able to EASILY change how the system and its programs do anything.
Meta-programming and Scripting
People today do many repetitive things on their computers. In fact, we have developed typing/clicking scripts in our heads to get through these annoying processes. This is a sign that the user and the system are not communicating properly. It is an incentive for the user to enter input without thinking, which can be a dangerous thing. The user already has to sort out his own problems: communicating with the machine shouldn't be another problem on his mind (even if this communication problem tends to consist of dumb, busy work). Through meta-programming and scripts, users would be free to optimize their actions. In Windows, there exist scripting options, e.g. Unisyn AutoMate, but since 99% of programs have closed interfaces, it becomes a huge pain in the ass to program scripts to click in the right spot on the screen given the right conditions, etc, etc.
Program Editing at Run-time
Users should be able to change the programs they are using at run-time. The current paradigm of edit-compile-run does not allow this. I think some people at TUNES are trying to solve this with a Lisp-like language. Programs would run by constantly interpreting their script. Any changes on this script would be reflected in the program's execution. Voilà.
Backtracking
A history of the state of the system (and all subsystems, e.g. individual processes) should be kept. It should be easy to go backwards and forwards through all user actions. It should be easy to combine aspects of different historical states.
The System Should Always Listen to the User
User input processes should have absolutely first priority. A frozen system is inexcusable. A command to end a process should be obeyed immediately.
Consistent Programming Interfaces (TUNES: Unification)
For the programmer, as well as for the user, there should be no difference between accessing something from memory or something from the hard disk. I can probably come up with similar examples.
Files and Stuff: Where Things Are
On my ideal system, files, objects, etc on disk/memory are multiply indexed for search purposes, each index as specified by the user, and there may be many directory trees, if this is found to be convenient. Files are not inside directories: everything is shortcuts. To each file, the user can attach information of any structure, which is searchable in a virtual "database of files". See AskSam.
Orthogonal Persistence
Files should be saved automatically as you type them. If you're not sure you want to commit to your changes, you should work on a copy. A user's work should never be lost due to not saving it on time!
End Modal Dialogs
Remember: the user is the boss. Modal dialogs prevent the user from accessing the information they need. I often need to close them and check the info I need before I can re-open them and finally do what I intended to do.
IDEAS ABOUT MEDIA / SOME USEFUL USER AIDS:
Planning of User Activities
Program to assist the user in planning his to-do list and specifying his goals
(chunked tree of goals, subgoals, etc. with most details unspecified, kinda like the "MS Project tree")
Let the user organize his current processes as he desires. Imagine a user doing 3 unrelated jobs at once, each involving a browser, an email message and a document editor. Most interfaces would organize the processes by application, which makes no sense. The user can get lost trying to find his precious window, because it is not in the right place.
Diagram Maker: Simple application for editing arbitrary structures (usually special cases of Graph) as a diagrammatic aid for the user. Maybe it could work as a semantics for the content. Maybe these documents coule be considered as records for search in super-queries
Links between applications: all we have today is Copy / Paste. Dragging should be encouraged.
In some programs, actions or commands can be awfully hard to find. It should take only keystroke to search for a command. Shell-command interfaces can be a good alternative to menus or pop-up lists.
Customizable interfaces: Self-Editable Programs
As part of optimizing his experience, the user should be allowed to change menus, shortcuts, etc. from within the program's normal interface. By holding a special key, the user can preview what an action will do, and change it if desired. Maybe SmallTalk does something similar to that.
I welcome any questions, comments, suggestions, etc.
Addition:
RELATED LINKS:
Windows Annoyances
Dertouzos: Author of "The Unfinished Revolution"
David Gelernter: THE SECOND COMING — A MANIFESTO
Comments by John McCarthy
"Unfortunately, the making of computer systems and software is dominated by the ideology of the omnipotent programmer (or web site designer) who knows how the user (regarded as a child) should think and reduces the user's control to pointing and clicking. This ideology has left even the most sophisticated users in a helpless position compared to where they were 40 years ago in the late 1950s." -John McCarthy
I used to dream of starting a system from scratch, and writing all my programs for my system, so that over time it would develop into an optimized environment for its user (i.e. me). For a while, I had faith that Linux with all its open-source goodness, had done that most of the work for me, and all I would have to do was implement my ideas. Unfortunately, I never became well-versed enough with the system to find out if that was going to be possible. A year or two ago, I ran into the TUNES website, and realized that I wasn't the only one with a dream. In fact, these guys have been way ahead of me for a long time. Anyway, I think it's a good idea to write down *MY REASONS* for wanting a different approach to human-serving cybernetic systems (i.e. personal computers).
If you know of any systems implementing my ideas or solutions to any of my concerns on a Windows platform, please leave a comment. My goals fall short of Faré's goals. (btw, this website is definitely worth checking). Faré actually calls his ideal "computing liberalism" (in the sense of "libertarianism"), and accuses present systems of computing statism / conservatism, but I fail to see the analogy.
How computing systems should be, but aren't:
User control over the machine
All I want is to be able to access all inputs and outputs of my machine, with suitable abstractions. This shouldn't be too hard, as there already exist thousands of drivers out there for most data media, both input and output. Yet, it never seems trivial for the programmer to access these ports. Many of my frustrations have had to with finding graphics and sound libraries for different languages.
Programs should be written flexibly
As a rule, analysts and programmers can't predict how their users will want to use their system. People who spend a lot of time using the same program end up becoming experts at it, but at the same time, they eventually run into a wall, and can't improve their efficiency further. This is when they start noticing the limitations of the program. Thus, programs should be written in fine-grained open-source modules, so that they can be easily customized. Compilation and packaging shouldn't protect users from acessing internal functions of a program. The user should be able to EASILY change how the system and its programs do anything.
Meta-programming and Scripting
People today do many repetitive things on their computers. In fact, we have developed typing/clicking scripts in our heads to get through these annoying processes. This is a sign that the user and the system are not communicating properly. It is an incentive for the user to enter input without thinking, which can be a dangerous thing. The user already has to sort out his own problems: communicating with the machine shouldn't be another problem on his mind (even if this communication problem tends to consist of dumb, busy work). Through meta-programming and scripts, users would be free to optimize their actions. In Windows, there exist scripting options, e.g. Unisyn AutoMate, but since 99% of programs have closed interfaces, it becomes a huge pain in the ass to program scripts to click in the right spot on the screen given the right conditions, etc, etc.
Program Editing at Run-time
Users should be able to change the programs they are using at run-time. The current paradigm of edit-compile-run does not allow this. I think some people at TUNES are trying to solve this with a Lisp-like language. Programs would run by constantly interpreting their script. Any changes on this script would be reflected in the program's execution. Voilà.
Backtracking
A history of the state of the system (and all subsystems, e.g. individual processes) should be kept. It should be easy to go backwards and forwards through all user actions. It should be easy to combine aspects of different historical states.
The System Should Always Listen to the User
User input processes should have absolutely first priority. A frozen system is inexcusable. A command to end a process should be obeyed immediately.
Consistent Programming Interfaces (TUNES: Unification)
For the programmer, as well as for the user, there should be no difference between accessing something from memory or something from the hard disk. I can probably come up with similar examples.
Files and Stuff: Where Things Are
On my ideal system, files, objects, etc on disk/memory are multiply indexed for search purposes, each index as specified by the user, and there may be many directory trees, if this is found to be convenient. Files are not inside directories: everything is shortcuts. To each file, the user can attach information of any structure, which is searchable in a virtual "database of files". See AskSam.
Orthogonal Persistence
Files should be saved automatically as you type them. If you're not sure you want to commit to your changes, you should work on a copy. A user's work should never be lost due to not saving it on time!
End Modal Dialogs
Remember: the user is the boss. Modal dialogs prevent the user from accessing the information they need. I often need to close them and check the info I need before I can re-open them and finally do what I intended to do.
IDEAS ABOUT MEDIA / SOME USEFUL USER AIDS:
Planning of User Activities
Program to assist the user in planning his to-do list and specifying his goals
(chunked tree of goals, subgoals, etc. with most details unspecified, kinda like the "MS Project tree")
Let the user organize his current processes as he desires. Imagine a user doing 3 unrelated jobs at once, each involving a browser, an email message and a document editor. Most interfaces would organize the processes by application, which makes no sense. The user can get lost trying to find his precious window, because it is not in the right place.
Diagram Maker: Simple application for editing arbitrary structures (usually special cases of Graph) as a diagrammatic aid for the user. Maybe it could work as a semantics for the content. Maybe these documents coule be considered as records for search in super-queries
Links between applications: all we have today is Copy / Paste. Dragging should be encouraged.
In some programs, actions or commands can be awfully hard to find. It should take only keystroke to search for a command. Shell-command interfaces can be a good alternative to menus or pop-up lists.
Customizable interfaces: Self-Editable Programs
As part of optimizing his experience, the user should be allowed to change menus, shortcuts, etc. from within the program's normal interface. By holding a special key, the user can preview what an action will do, and change it if desired. Maybe SmallTalk does something similar to that.
I welcome any questions, comments, suggestions, etc.
Addition:
RELATED LINKS:
Windows Annoyances
Dertouzos: Author of "The Unfinished Revolution"
David Gelernter: THE SECOND COMING — A MANIFESTO
Comments by John McCarthy
"Unfortunately, the making of computer systems and software is dominated by the ideology of the omnipotent programmer (or web site designer) who knows how the user (regarded as a child) should think and reduces the user's control to pointing and clicking. This ideology has left even the most sophisticated users in a helpless position compared to where they were 40 years ago in the late 1950s." -John McCarthy
continuation...
Date: 2003-12-16 04:07 pm (UTC)Human software uses multiple, diverse representations. Programming would be much easier in a language that would naturally embody these representations, but such a language cannot be neat. Languages choose neatness and thus limit the freedom of the programmer. Extrapolating from the general principle I stated about software users, this limitation is probably good for the beginning programmer (there's only so many structures to learn), but bad for the expert.
So, do we need programming languages which are self-extensible? If so, how? IP, not being a programming language itself, seems to suggest a different approach.
I have a disclaimer too: read my ideas for what they're worth. They may be completely wrong and worthless.
Perhaps you can show me what you're doing and we can collaborate through IM?