A type system for communication
I thought of this because I was often understanding the gist but not the details of Reasonably Polymorphic's blog. I really dislike moments where I'm trying to learn something, and it feels like I'm missing so much assumed knowledge that I don't know where to begin to fill in my own knowledge.
So naturally, I thought of how I'd write a program that helps my articles to not leave my intended readers in a similar boat.
In communication, we try to make someone understand an idea that exists in our heads. We piece together words into sentences, sentences into articles, and articles into ideas. Person A might read our article and grok it completely; Person B might get stuck after we use the word "inadvertently"; Person C might get stuck after we use the word "isomorphism".
We write code which is composed into "code that compiles" which produces a program. Your code references:
- Basic constructs, like
for i in numbers, function definition, etchello = \s -> "Hello, " ++ s. - Other code, referenced with
import Html exposing (div).
Let's draw this analogy back to communication.
We write words and sentences (and maybe other articles) into articles, which produce an idea in someone's head. Your article references:
- Basic grammar and words, which come from the average dictionary sitting in your reader's head.
- Other articles, which good writers reference, but many omit.
When someone gets stuck, it's because they're coming across either:
- A word they don't understand, and they should go check the dictionary.
- An idea (embedded into a word or a sentence) that they don't understand.
Good writing for a particular audience:
- Uses words that most of their audience understands without a dictionary. They might add a fancy new word for users to look up when it's going to be very common in their article, and it would save a lot of words to explain it.
- References ideas that their article depends on, which they will not explain.
This might be a lot to keep track of, so I suggest making a program that will keep track of these things for us.
A program for good communication
Choose your audience for a writing piece, which might be: scientific, undergraduate, high school, layman. You can add particular specialties like carpenter or programmer. Our tool will store a dictionary subset that each of these groups tend to understand. When you use a word outside your audience's dictionary, you'll get a little warning; you can dismiss it (expecting your readers to look it up), or add a little definition yourself. If you're publishing to the web, you can even generate a hover-tooltip or a footnote. When you write "inadvertently" for layman, you'll get a warning, or a suggestion to use "accidentally" instead.
Now for the most important part; when you add new ideas, you add an article defining them or linking to other articles explaining them. When you write "isomorphism", you'll be asked to define it or link to an article that does.
Many ideas worth telling are abstract; they rely on ideas that rely on ideas. For communicating this information, a self-contained wiki is very helpful for letting readers fill the gaps in their understanding. The edges of your wiki's page-graph will contain links to articles and books elsewhere in the collective knowledge of the world.
Perhaps in a collaborative wiki, users could flag articles as needing more explanation. Wikipedia currently has the Simple English subset of its English graph, but if someone's trying to communicate practical functional programming, they could construct a wiki for the layman and programmer.
By tagging content with its audience, and further tagging its assumed knowledge, we can construct graphs of knowledge help readers navigate learning increasingly abstract ideas by themselves.