A mental model of computers, humans, and interactions between them for the near future.
A mental model is an abstraction about how someone or something works. A reflection of a real thing that happens in our minds.
For example, my mental model about why trees' branches go up instead of horizontally:
Trees grow their branches up looking to maximize the sunlight they receive, so that they can get more energy from the sun to live.
Sometimes, mental models are a wrongful explanation of how things work:
There are little dwarves inside every computer that make it work.
Sometimes, wrong mental models are just fine, specially to explain systems that are too complex:
The Bohr model is a relatively primitive model of the hydrogen atom. As a theory, it may be considered to be an obsolete scientific theory. However, because of its simplicity, and its correct results for selected systems, the Bohr model is still commonly taught to introduce students to quantum mechanics or energy level diagrams before moving on to the more accurate and complex theories.
Let's work with the following mental model for human agency (it might not be super accurate, in fact, it's rather simplistic and wrong in the sense that it assumes a very rational human):
Human beings have:
- a mental model (conscious or unconscious) of how the environment works
- a set of resources available to them
- an ability to perceive the state of the environment (although incomplete)
- a set of needs, evolved to serve their genes (nature), and influenced by memes (nurture)
- the ability to express needs in form of requirements
- the ability to act on their environment with the prospect of meeting their requirementsThus,They transform needs/wants into requirements based on their mental models.They combine requirements, resources, perception to plan curses of actions.They decide on the best curse of action, interacting with the environment.They observe the outcomes of their actions, and also other environmental changes unrelated to their actions ("changing conditions").They update their mental models based on the outcomes and new information.
This is a very mechanistic way of thinking about humans. It's almost like thinking of humans as computing machines, which, in some sense, they are (there's a bias regarding modeling human behavior as the most advanced piece of technology -- I remember an anecdote about how in the 1800's, some people thought of the brain as multiple little connected steam engines).
I believe that when human's mental models closely resemble how a computer actually works, magic happens.
How can we create a way of programming and interacting with computers that works better with the above presented mental model of human agency?
A key aspect of computers better and more efficiently supporting the wants of human users is, for sure, the ability for computers to understand human intentions. We can work on this on the two sides of the problem: improving the tools for humans to express themselves, and improving the pattern recognition mechanisms of computers.
Recently, with GPT-3 being out there, we've advanced quite a bunch on the pattern-recognition part. Let's work on improving tools for humans to express ourselves to computers and to work together with them better. Some random ideas on what this expressivity needs:
- There needs to be some kind of inherent transparency on how the computer is thinking and/or executing the orders of the user. Smalltalk did this very well early on, by having a very transparent interface that you could click to see and modify how it worked.
- "If you see something, say something" -- computer should let the user know how it is interpreting their orders, and maybe predict or suggest alternative courses of action.
- That the computer has some capability for agency itself, but the human needs to understand it -- so the computer must be guiding the user through its execution capabilities, maybe through clarifying and double-checking that the user understands what the computer is about to do.
- Transparency into how the computer will actually execute, before it does so, for example by checking the source code, or signaling dangerous operations that might come.
- The ability for the user to "teach it new tricks". New tricks take the form of new code that the user inputs to the system, with some definition (maybe through a discussion with the computer) about how the code is useful and for what objectives.
- The ability for the user to define "abstract entities" and for the computer to have a storage mechanism that more likely resembles that fuzzy memory of humans.
- Access to the same corpus of data for human and computer. Computer should be able to know something about the user, in order to customize the experience. A system like this should be highly personal, for privacy concerns that might arise.
- Inference of behavioral patterns when utilizing normal tools. For example, letting the computer know that one is about to do a repetitive task, and having the computer understand the key elements of that repetitive task, so the user can trigger this "macro" later on.
How do you trust your data and code?
For a while now, my main problem as a developer has been a cognitive dissonance between my mental models and the code that I end up writing. I want to explore the possible ways forward for a system that allows me to augment my understanding of how computers work. These thoughts are heavily influenced by similar quests for better machine-assisted human action, like https://futureofcoding.org/catalog/, https://dynamicland.org/, and https://malleable.systems/.
A way of looking at programming is that it's about making data visible. What constitutes relevant data? What is it the operator of the computer wants? I'll pose a conjecture:
The distinction between the programmer and the user, compile time and run time, and the inability to change and inspect the mechanisms that are at work are the enemies of useful augmentable systems.
In this context, a normal web/mobile user gets this relevant data in the form of feeds, forms, pages, and views of conversations.