The Untapped Potential of Human Programming
A vision-building essay for a new kind of human-computer collaboration
Introduction: Coffee
You buy a new coffee maker, and don’t know how to use it. You scan a QR code on the machine, which brings up a virtual assistant to guide you through brewing your coffee. The assistant asks you: “what kind of coffee are you making?” with choices “cappuccino”, “americano”, etc. You select “cappuccino” and the virtual assistant guides you step by step through the brewing process. One step of the process is unclear:
Pour milk into the milk compartment.
“Can I use my almond milk?”, you wonder. You click a button labeled “need help?” and are immediately connected with customer support. The customer-support agent speaking with you sees the exact instruction you needed help with. The agent answers your question, then edits the instruction that was unclear, to now read:
Pour milk (any cow’s milk or barista-grade milk alternatives) into the milk compartment.
All future users of the coffee machine will see the updated instruction when they use the virtual assistant.
What is human programming?
Human programming is a massively important yet overlooked aspect of our lives.
Human programming is the practice of writing sequences of instructions for humans, often yourself, to follow. Human programming is already widespread: fitness coaches write programs for their trainees. Event coordinators write programs for an event’s participants. People write tutorials and setup documentation.
For the most part, a human program consists of two things:
a set of imperative instructions (like “stop”, “drop”, and “roll”)
a method for moving from one instruction to the next (like “stop → drop” and “drop → roll”)
Any human program can be encoded into many types of media. The “stop drop & roll” program can be encoded in an image, as shown above, but could also be encoded as text, audio, or even a simple flowchart.
The state of human-programming tools and media
The tools and media we use to write and to follow human programs are mostly pretty terrible. Many human programs are presented as articles or listicles. Articles are pretty easy to write, but very difficult to follow; how often has an article truly induced you to start a new routine? Some how-to guides like Wikihow are better than your average article because they have clearly delineated steps and visuals. However, the Wikihow format fails to encode complex or non-linear processes. For example, if you want to help people improve their relationships, you would have a hard time encoding your advice as a generally-applicable linear sequence of steps, though people on Wikihow do try.
Flowcharts are better for encoding nonlinear sets of instructions, but they too have their downsides: a flowchart creator must take time to arrange the nodes in their chart, which adds friction to the writing experience. And to follow a complex flow chart, the user must keep track of their position, which is especially difficult while context switching.
One web app presents a rare positive example for human programming: Guidedtrack. Though it is not exactly presented as a human-programming tool (it’s more for creating surveys), Guidedtrack can be used to design complex sequences of prompts. Guidedtrack is exemplary in that it separates the experience of writing a program from that of following a program: writing a Guidedtrack program is like writing code and following a Guidedtrack program is like following a survey.
Still, Guidedtrack is not perfectly suited as a human-programming tool: the coding language, which is great for creating complex surveys, is not optimized for rapidly iterating or modifying sequences of imperative prompts. Also, Guidedtrack is not a platform for discovering programs in the way that Wikihow is. That said, many of Guidedtrack’s features, especially on the writing side, would serve as good inspiration for a human-programming-specific tool.
In sum, I think that no one has made a great human-programming tool because no one has developed a tool with human programming specifically in mind. I hope to do so.
The vision of better human-programming tools
I believe that widespread use of effective human-programming tools could dramatically increase our productivity. With general-purpose human-programming tools we could externalize our work processes, lifting workflows out of our brains and dropping them into symbolic networks to be distributed, analyzed, fine-tuned, and remixed by communities of “human programmers”.
Anyone could instantly tap into this network and summon an interactive virtual assistant to guide them through the steps necessary to achieve any goal. Any workflow, no matter how hairy or complex, would be reduced to two steps:
Click a button
Follow an instruction
(and repeat)
Interlude: Life Design
Your friend recently read the life-planning book Designing Your Life, and recommends it to you. You google the book and see that many of the exercises from the book have been turned into human programs. This is great news! You can skip reading the book and directly begin applying its exercises by following these fan-created programs.
You open a program titled “Develop odyssey plans (from Designing Your Life).”, and see that the program is very popular, with hundreds of stars and thousands of successful completions. You inspect a high-level, flowchart-like visual of the program, and you see that the exercise involves a period of brainstorming, followed by a period of of drawing out three visual life plans.
You decide you’d like to give this life-planning exercise a shot, and click “start”. Your virtual assistant presents you with the following hierarchy of goals:
(Program goal)
Develop odyssey plans (from Designing Your Life).(goal 1)
Brainstorm three life plans.> (goal 1.1)
Grab a pencil and paper. (press enter to complete)
You have actually previously brainstormed three potential career options, so you can skip the brainstorming part of the program. You press the up arrow to select goal 1…
(Program goal)
Develop odyssey plans (from Designing Your Life).> (goal 1)
Brainstorm three life plans. (press enter to complete)(goal 1.1)
Grab a pencil and paper.
Then you press enter, indicating you’ve completed that higher-level goal. You’ve now skipped all sub-tasks of the goal “Brainstorm three life plans” and are presented with a new list of goals:
(Program goal)
Develop odyssey plans (from Designing Your Life).(goal 2)
Draw your odyssey plans based on your three life plans.(goal 2.1)
Draw your first odyssey plan.> (goal 2.1.1)
Grab an odyssey planning worksheet. (press enter to complete)
You now work diligently through each step of drawing your first odyssey plan. The instructions are clear and specific, and you’re proud of your resulting plan.
You’d like to take a break before making drawings for your remaining two plans. Your progress within the program is automatically saved, meaning you can pick up where you left off at any time.
You resolve to complete the program over the weekend. You already have a program you plan to follow this weekend called “Weekend to-do list” and you’d like to add completing your odyssey plans to that to-do list. So, from your current position in the odyssey planning program, you click a button titled:
Copy session link
You paste this link into the “Weekend to-do list” program as a program step. Now, you can rest assured that when you go to complete your weekend to-do list, the assistant helping you complete your tasks will pick up where you left off with the odyssey planning, guiding you to create drawings for your remaining two life plans.
Key questions for a better human-programming tool
Many existing human-programming tools fail to decouple the writing experience from the following experience, leading to compromises in one or the other or both. With that in mind, I present the following vital questions underlying human-programming-tool design:
What is the optimal user experience for writing programs?
What is the optimal user experience for following programs?
What is the optimal language/encoding scheme?
I’ll answer these questions in depth in future writings, but here are my preliminary answers:
The user experience for writing human programs can be copied from note-taking and software-development tools.
The user experience for following human programs can be copied from surveys and learning tools.
The language/encoding scheme for human programs is the hardest part (but I have some ideas).
In slightly more detail:
1. The user experience for writing human programs can be copied from note-taking and software-development tools.
Humans have already poured decades of research and billions of dollars into developing note-taking tools for writing in natural languages and software-development tools for writing in programming languages. A good human-programming tool would draw inspiration from both, since human programs can combine free-form natural language statements (to prompt the human) with syntactically-strict linkages and commands (for automating the virtual assistant which guides the human).
Note-taking tools as inspiration
In the natural-language domain, outliners and knowledge graph tools like Roam Research or Logseq (my note-taking tool of choice) already provide an exemplary user experience for writing free-form text blocks with structured relationships. This structure maps well to the conception of a human program as a set of free-form instructions and a set of strict relationships between instructions. The image below demonstrates one way a human program could be written in the outliner Logseq:
In the image above, each instruction of the program is a distinct bullet point. The instruction “write a substack post” has sub-instructions encoded as indented bullet points. Other programs like “write a good essay” (whose sub-instructions would be written on a separate page, not shown) are included in the “weekend to-do” program using the outliner’s [[page link]] syntax. This linking syntax would allow a program to be re-used as a step in multiple parent programs.
The linked relationships in our simple program can be seen below in Logseq’s graph view:
Importantly, all of these relationships were created using simple key commands: tab to indent, enter for newline, and [[page link]] for linking. Such a rapid and intuitive interface for building and modifying relationships between instructions is vital for a human-program developer.
Software-engineering tools as inspiration
Generally, we encode human workflows as sequences of imperative instructions (“stop, drop, and roll”). So, we can copy capabilities from existing imperative programming languages to make our human programs powerful in the ways that computer programs are. For example, we can use variables and conditional branching to enable customizable and interactive workflows. Ideally, such features would be opt-in from the writer’s perspective; a user could write simple human programs in pure English (or their preferred natural language), while a more advanced user could write abstract and powerful programs using keywords and symbols.
We can also copy features of software-engineering tools, like version control, syntax highlighting, auto-complete, and multi-pane editing, to name a few. One way to make use of such features would be to write a human-programming language and use existing software-development tools to manage and edit files in that language. I made a prototype for a human-programming language here, and you can see a sample file written in the language here (For now I am working on a web-app version of human programming to prioritize collaboration and rapidly shareable program links).
2. The user experience for following human programs can be copied from surveys and learning tools.
There are many examples of software intended to guide humans through sequences of tasks. Among the best are survey tools that present questions one at a time, for example:
Similarly, we can draw inspiration from learning tools like Khan Academy, which presents videos, reviews, and quizzes as sequences of tasks:
A great human-programming tool would give the follower a similarly simple interface; each step of the program would be presented as a standalone page with a clear imperative instruction, a button for continuing to the next instruction, and sometimes a workspace in which to complete the current instruction.
3. The language/encoding scheme for human programs is the hard part.
The way instructions and logic are encoded by a human-programming tool directly constrains the space of possible programs that can be encoded, which in turn constrains the space of human activity that can be aided by the tool. And, while the encoding scheme can be inspired by existing tools and languages, it cannot be copied in the same way that the user interfaces for the tool could be. It’s the core of human programming, and it’s the thing that doesn’t yet exist.
Throughout this essay I’ve hinted at some aspects of an encoding that I think would be useful: goal→subtask relationships with overlapping hierarchy, variables, conditional branching, cascading permissions, instruction←→workspace pairs, and sessions as data. However, these features are mostly based on intuition. Developing the most useful encoding scheme will require:
Study of the nature of workflows, how people think about them, and how people follow them
Imagination, to envision new software design patterns that combine the strengths of human and computer execution
The extended vision: new programs
After externalizing our existing workflows, we will develop entirely new workflows that are currently unimaginable: workflows that make full use of our cognition and skills, but are no longer constrained by the limits of human memory and executive functioning. We will develop a new way of thinking: “what can I do?” will become “what can I and an army of my future selves do?” or, better yet, “what can I and an army of my future selves who each command their own army of future selves do?” This new way of thinking will give us the power to set ambitious goals and systematically turn them into reality.
The vastness of possibility afforded by human programs draws me towards making effective human programming a reality.
I’ll leave you with one last example…
Conclusion: The omni-program
You walk to your favorite cafe, sit down, stretch, and open your computer.
Good morning! Listed below are the activities that are most pressing. If you have time, please select an activity to complete that most excites you in this moment:
> 1. Review the program ‘cultivate gratitude’.
2. Define sub-instructions for ‘Plan a dinner party’.
3. Reprioritize your high-level goals.
4. Meditate on an important statement.
You choose to review the ‘cultivate gratitude’ program, pressing enter:
Remind yourself: You review your programs to make sure that they are always best suited to your current needs. By reviewing this program, you are helping countless versions of your future self to cultivate gratitude.
> Continue
Having read the statement, you press enter:
Think back on the times you’ve followed the ‘cultivate gratitude’ program. Does this program do the best possible job in guiding you to cultivate gratitude?
> 1. No, the program could be better.
2. Yes, the program is flawless.
You think that your program could be better, so you press enter:
Answer: In what ways does the ‘cultivate gratitude’ program fail?
> __________________________
Continue
You type: “sometimes I mindlessly go through the gratitude exercises without truly feeling gratitude”, then press enter:
Read through the ‘cultivate gratitude’ program below, and edit the program to prevent the following:
“sometimes I mindlessly go through the gratitude exercises without truly feeling gratitude”.
> ——————————————————————————
cultivate gratitude
1. Open your journal to a new page.
2. Write three things you’re grateful for.
——————————————————————————
Continue
You click on the text box containing the ‘cultivate gratitude’ program, adding three sub-steps to the second instruction, so that the program will contain more specific guidance:
2.1: Write a full sentence describing something unexpected that you’re grateful for.
2.2: Write a full sentence describing something about yourself that you’re grateful for.
2.3: Write a full sentence describing something you are often grateful for.
You save these new sub-steps, and press continue:
Read: Thank you for reviewing and improving the ‘cultivate gratitude’ program!
> Continue
Having read the statement, you press enter. You are excited to try out this new gratitude program tonight! You return to your morning program, which no longer contains “Review the program ‘cultivate gratitude’” in the priority queue:
Good morning! Listed below are the activities that are most pressing. If you have time, please select an activity to complete that most excites you in this moment:
> 1. Define sub-instructions for ‘Plan a dinner party’.
2. Reprioritize your high-level goals.
3. Meditate on an important statement.
4. Check in on Patricia.
You decide you’d like to meditate on an important statement, and pressing 3, are presented with the following:
Below is a statement that you’ve deemed important. Please read it, think about it, and consider how it might apply to your life now:
”When you add songs to your playlists, you add them in anticipation of specific moments. Make those moments real.”> Continue
You read the statement, and close your eyes… “this is true”, you think, “… and it has been a long time since I’ve listened to my ‘Road Trip’ playlist”. You press enter, then close your computer and walk outside. You take out your phone to call a friend: “Hey, are you doing anything this weekend?”
. . .
Super compelling dude. Feels like a lot of life is learning ways to prompt/program yourself effectively. Excited to delve more into your writing
I skimmed this article and took the graphic "home or business use" as an example of an anti-pattern, as the icons could easily represent "do you live in a single family home or a multi-family home" but instead the assumption is "people live in single family homes and work in tall buildings" which is the opposite of what a lot of people experience.