User blog:Rgetar/Problems of Internet

Initially I was not going to publish it here, but since some users here are concerned about problem of the online community, I decided to share with my thoughts on the problems of the Internet, their causes and possible ways to eliminate them.

Advantages of the Internet
Internet is great invention, its advantages:


 * 1. People with similar interests easily can combine theirs efforts.


 * 2. It is easy to publish content.


 * 3. Safety and peace, since your enemies can't get to you. And it is pointless to start a war, since you can't get to your enemies, and if you do not like a web page or site, you just close it and search for another web page or site which you like.

These advantages should lead to production of large amount of content.

Disadvantages of the Internet
But something went wrong.

Internet suffers from specific problems, virtually absent in real life.

It is not so easy to find people with similar interests and combine efforts. It is not so easy to publish your content. And often there are wars.

There is not very large amount of content in the Internet. There are billions of Internet users, but it seems like there are only few millions of them. Apparently, less than one percent of users are active users, which regularly post something and create Internet. But majority of users just view web sites and do not post almost nothing.

Root cause of problems
I think that root cause of specific problems of the Internet may be lack of information from other users.

In real life we get words from people, see theirs appearance, hear theirs voices, see theirs behaviour, gestures.

In Internet we get much less data from other users - mostly text. Less data - more ambiguity.

As a result users often misunderstand each other and make wrong decisions.

List of problems of the Internet
Some problems are from ambiguities, some are from attempts of separation of the warring parties, some are from dynamicity of web sites, and some are from knowledge, whether two posts have the same author, or different.

Ambiguities of negative statements
Here is my classification of negative statements:


 * 1. For friends: dissociation ("I'm not like them, I do not wish them harm, but I want to be apart from them").
 * 2. For foes:
 * 2.1. Reaction:
 * 2.1.1. To negative: counter attack.
 * 2.1.2. To positive ("you say that you are good, but you are not that good").
 * 2.2. Not reaction:
 * 2.2.1. Justified: protest ("stop your destructive activities").
 * 2.2.2. Unjustified: aggression.

These 5 types of negative statements may be confused with each other.

Example. Let on a web forum there are two warring parties, and they do not want to fight with each other, they want to peacefully discuss issues with friends, not with foes. And let a hot conflict topic appears. Users start to discuss it, tell theirs opinion and affiliation with one of the parties:

Member of party 1: Hi! I like party 1, I am real true member of party 1, and I think that party 2 are fools.

Member of party 2: What!? Death to you!

A war begins, which no one party wanted.

So, statement of member of party 1 was dissociation (1), but member of party 2 thinks that this is agression (2.2.2) and responses with counter attack (2.1.1), party 1 thinks that this counter attack is agression (2.2.2) and responses with counter attack (2.1.1), etc.

Discussion becomes pointless, users leave forum, topic dies.

Ambiguities of positive statements
Classification of positive statements is similar:


 * 1. For friends ("I like you, I want to be with you").
 * 2. For foes:
 * 2.1. Reaction:
 * 2.1.1. To negative: apology ("you say that we are bad, but we are not that bad").
 * 2.1.2. To positive ("you say that you are good, but we are better than you").
 * 2.2. Not reaction:
 * 2.2.1. Justified: proselytism ("we are so good, join us").
 * 2.2.2. Unjustified: spam.

Ambiguities of ignoring
Maybe it is better to just ignore opposite party?

But ignoring also has ambiguities:


 * 1. Boycott (not feeding trolls, disrespect).
 * 2. Because don't care (ignoring something insignificant, uninteresting, unnotable).
 * 3. Because of respect (not interfering, not objecting, not interrupting, not distracting).

Let two warring parties boycott (1) each other. Then a newbie comes and thinks that they don't care (2) ("they are not serious, they do not understand this important difference"), and do not join to the discussion. Or, a newbie comes and thinks that they respect (3) each other, what is worse ("my party respects the opposite party, so, maybe, opposite party is not so bad?"), then de-radicalizes and loses individuality.

Popularity
When you post something on thread, you make this thread and all its comments more popular, including comments of opposite party. So, users may tend not to post anything on thread, if it contains comments of opposite party to not making them more popular.

Exploitation of ambiguities
Ambiguities can be exploited deliberately. For example, trolls can represent themselves as victims and mask aggression (2.2.2) as protest (2.2.1):

User posts some content.

Troll: Please, delete your post. It was very unpleasant for me to read it. And do not make such posts again.

User: If it is unpleasant for you, why do you read it? Do not read this site, if it contains such posts.

Troll: But I like this site. Why should I give up reading it because of people like you?

And conscientious user should apologize and delete this post. Especially since user may see unpleasant content at favorite sites and think: "What if my content is unpleasant for some people as that content for me?"

Separation of the warring parties
The way to prevent online wars is to separate warring parties, for example, to create separate sites for each party and keep out opposite party.

Barriers
This is usually done using barriers: registration, invites, rules, moderation. But rules and moderation may be imperfect. This may work against friends and create trouble for newcomers.

Stagnation
But there is more serious problem.

Perspective trends should not stand still, they should be developed, split into new trends and movements and generate new trends and movements. The more perspective trend is, the more diverse it is. But if site has means against external enemies, these means may be misused and be applied for infighting. Wars with external enemies may end in victories, but civil wars begin. The danger of external enemies can be exaggerated in order to seize power. If threats from external enemies persist, people tend to come together and do not show their individuality. All this may lead to tyranny of administration and/or tyranny of majority (if users can estimate posts of other users). New trends at this site are suppressed, and this leads to stagnation.

How to solve this problem?

Well, we stopped war between two parties by isolating them from each other, and now we can do the same. That is, when a party is split into subsidiary parties, we can create clone or fork of the site for new party.

Disadvantages of this method:


 * it may be difficult to create and administer new site
 * when you create new site, you get empty and unknown site, which you should fill with content and make popular, what is also may be difficult
 * the new site suffers from the same problems

Indeed, the new party may split further, especially if the new trend is promising and fast-developing, and each time it splits we need to create new fork.

The more highly specialized site is, the more strict rules it needs, more tyranny, less freedom and less popularity.

Off-topic
Also the new trend may be off-topic and need separate site (it happens that the new trend is inspired by the old and completely different from it).

Also, if user has many different interests, they should find and use many different sites.

Dynamicity
Dynamicity of site means that its pages may change over time.

If content at dynamic site is created by many users, they can interfere with each other, so, users must take into account each other's actions. User can doubt whether to post theirs content:


 * User may fear that their plan may be spoiled by the actions of other users
 * User may fear that theirs actions may spoil other's plans

Also, if dynamic and editable by anyone site already has valuable content, it must be constantly guarded from vandal attacks.

Knowledge, whether two posts have the same author
Maybe, it is better to create your personal blog, or site, or account at social network, which only you can edit?

Adventages:
 * full freedom
 * no rules
 * no moderators
 * no other users which can interfere with you
 * all your content is on-topic
 * no vandals

Disadventages:
 * low productivity
 * no pooling of efforts
 * small coverage of topics (since one person is not interested in everything or can not pay much attention to each topic)
 * low quality (since one person can not be good in everything, and other users do not correct their mistakes)
 * if site inspires readers to create content, they can not post it at this site and should search for another site to post it
 * readers know that your posts have the same author

Indeed, if there are many users at sites, this problem can be easily solved just by hiding of authorship of post. Since there are many users, and it is not clear to reader whether two posts have the same author, or different, but at personal site it may be obvious that all posts have the same author.

Problems from knowledge whether two posts have the same author, or different:
 * estimation of content based on the author's previous content
 * vulnerability
 * inequality

Estimation of content based on the author's previous content
When users read post, they may wonder, who is author, and what content the author posted before. They may treat the post based on whether they like author or the author's other posts rather than the post itself.


 * Content may be underestimated, if readers do not like its author, or have some prejudice against author, or author did something wrong, or author posted low-quality content in past. It can make the author to post only high-quality content rather than all content in order not to spoil their reputation.


 * Content may be overestimated, if readers like its author or author posted high-quality content in past.

Vulnerability
If you post too much content and readers know that it have the same author, you become too vulnerable. You become celebrity and public person, and your private space is violated.

All people are different, and it is impossible to please everyone, so you will have enemies. And if you post all you want, eventually you'll post enough to identify you with real person, and your enemies can find you in real life.

Or, if user do not like some post, they can harass its author and attack author's other posts.

Inequality
If readers know who is author of the post, they may know how much content this author posted, how many subscibers, friends, views etc. they have, registration date and other data. And these data can be very different for different users.

But there is experimental evidence that the community is growing richer if its members are not aware of the wealth of its other members, and that people subconsciously tend to equality. Maybe, this is true also for online communities?..

Hate
Here are my thoughts about online hate.

Hate is not a separate problem, it may be related to "Ambiguities of negative statements" section. But since online hate is considered a big problem of Internet, I decided to express what I think about it.

I think that hate itself is harmless, but in Internet it has harmful side effects - ambiguities, misunderstanding.

Sometimes hate may be pleasant - when your enemies hate you, but they can not do anything against you.

Sometimes hate may be even useful - it may help to express protest or overthrow a tyrant.

Usually people do not care that, maybe, someone hates them, as long as it does not harm.

Why, after all, online hate become a problem? Because it is often unclear, if this is agression (2.2.2), protest (2.2.1) or dissociation (1).

If this is agression, you should defend yourself and your friends.

If this is protest, you should negotiate with hater and ask them to explain what is wrong.

If this is dissociation, you should ignore it.

But how to react when it is unclear?

Let's say you communicate with friends in online community. Then hater comes and post hate comment.

What to do? To ban or not to ban?

If not to ban, then your friends are embarrassed, they think: "Is this normal or wrong? Should I intervene and defend my friends? Are they ok or not?" Your friends doubt if they understand you, you doubt if they switched to the hater's side, or you may feel betrayed by your friends, and your community falls apart.

If to ban or to do something else against hater, then you look like a tyrant suppressing protests, nonconformity and freedom of speech and destroying hater's work. Your friends start to fear you and think: "What if I accidently do something wrong?" Also, newbies do not join your community, since they may think that they (newbies) are not welcome. And your community falls apart.

So, online hate inflicts real harm due to this uncertainty.

Impossible triple
So, there are three good things in Internet which cannot be together:


 * Freedom
 * Pooling of efforts
 * Separation of the warring parties

There are three types of site:
 * With freedom and separation of the warring parties, but without pooling of efforts. Examples: personal sites and blogs, social network accounts. Site is paralyzed by low productivity / quality.
 * With pooling of efforts and separation of the warring parties, but without freedom. Examples: forums, wikis. Site is paralyzed by stagnation.
 * With pooling of efforts and freedom, but without separation of the warring parties. Examples: sites without rules and moderation. Site is paralyzed by online wars.

Biases
These problems lead to biases in Internet: towards conservatism, short discussions, not serious content.
 * Conservatism, since new ideas are suppressed.
 * Short (and rare) discussions, since peace is unstable, so, long discussions eventually lead to misunderstanding and online wars.
 * Not serious (entertaining) content that everyone likes, since discussions of serious conflict topics quickly lead to wars and become pointless. Therefore, conflict topics are often forbidden. But conflict topics should be discussed, otherwise the conflict will not be resolved.

Did you notice that there is almost no scientific research in Internet? Because scientific research implies all three things which are suppressed: new ideas, long discussions and serious (sometimes conflict) topics.

So, currently Internet is dominated by frequently updated sites with short discussions, entertaining content and conservative viewpoints.

Fully editable sites
I think these problems may be partially solved using other architectures of sites.

For example, we separate warring parties using different sites for each party, and when within online community a new idea is born, it needs a separate new site, but each time we get new empty site that you want to fill with content.

But we can make this process much easier if we automate the creation of clones (forks) of the site. Moreover, we can make it so that every edit creates new clone of the whole site.

We can make static tree-like fully editable sites: a site consists of many static versions. "Static" means that versions cannot be changed. There are many pages on the site. Each page also has many (static) versions. User can view each site version and each page of this site version. If user views a page at a site version, then server calculates page version from given page and site version, and this page version is displayed.

Also, user can edit each page at each site version. The edited site version is not changed (it is static), but the edit creates new site version and new version of edited page, and now this new site version can be viewed and edited as the other site versions.

This is like wiki sites, but your edits create not only new versions of edited pages, but also new versions of the whole site.

Now what is the difference: you edit a page at wiki site and create new version of this page, and it becomes current version. Then someone edits it again, and this new version becomes new current version. But your version is saved in history and can be viewed.

But actually this is your version only partially. Firstly, current versions of files and templates, used in this page, are displayed, and they could be changed. And secondly, internal links lead to current versions of other pages, and they also could be changed.

Now imagine: you edit a page and create new version of this page, and also new version of the whole site, and this whole site version is saved, can be navigated through internal links, viewed and edited, but cannot be changed itself. That's what "fully editable" means.

Somewhat you can get at your disposal the whole huge site and change/add/delete all what you want, and no one will prevent you, since they can view and edit your site version, but can't change it. And you do not prevent anyone, since you just add new site versions and do not change existing site versions.

How does it work?

Let currently there are 100000 versions of the site.

Page url looks something like this: sitename/12345/Cat Here


 * "sitename" is name of the site
 * "12345" is site version
 * "Cat" is page name

Let currently there are 95 versions of page "Cat".

So, when you follow this url, the server calculates version of page "Cat", corresponding to site version 12345, and displays this version of page "Cat".

Let this version of page "Cat" is 51, and let source code of this page version is Cat eats mouse. (Here MediaWiki-like markup is used).

But now, unlike MediaWiki, server adds site version to the internal link, so the internal link mouse is displayed so as it leads to sitename/12345/Mouse Now let you are trying to view the same page "Cat", but at another site version 25000. So, you go to sitename/25000/Cat Again, the server calculates version of page "Cat", corresponding to site version 25000, and let it is again 51. But now, despite the same source code, it is displayed differently: now the link mouse is displayed so as it leads to sitename/25000/Mouse So, when you navigate through internal links, you stay within one site version (unless site version is explicitly stated in source code of internal link).

Now let you are trying to edit this page (Cat) at this site version (25000). Let source code of this your edit is Cat eats mouse and has tail. So you create new version 96 of page "Cat" (child of version 51 of page "Cat"), and new version 100001 of the site (child of version 25000 of the site).

This new site version 100001 is very similar to site version 25000, but they have two differences:


 * 25000 has version 51 of page "Cat", and 100001 has version 96 of it (all other page versions are the same)
 * "25000" at all displayed internal links is replaced with "100001"

Particularly, link mouse now leads to sitename/100001/Mouse

Versions of site and its pages are organized as trees of versions, that's what "tree-like" means.

Solving problems
And how this site architecture solves the problems of Internet? Consider each of the problems listed in "List of problems of the Internet" section of this blog.

Ambiguities of negative statements
The problem is that it is difficult to say in Internet "I do not like them" and not provoke a conflict, since it may be unclear whether a negative statement is dissociation, protest, aggression or something else.

Return to the above example: let on a web forum there are two warring parties, and they do not want to fight with each other, they want to peacefully discuss issues with friends, not with foes. And let a hot conflict topic appears.

At fully editable site you may follow a simple rule: if you want peace, do not edit site version, if it contains something you do not like.

Users start to tell theirs opinion, but they do not edit opposite party's posts. The discussion quickly divides into two branches, each of which is completely free of opposite party's posts. Each party may make negative statements about the opposite party, but it is completely clear that this is dissociation, not protest or aggression, and online war does not begin.

And what if one party wants peace, and the other party wants war? Then the discussion turns into one main long branch with many small and short branches: the main branch is posts of the peaceful party, and many small branches are attacks of the warlike party. But these attacks are systematically ignored by the peaceful party (they just do not edit them - they edit only friends posts), the main branch remains completely free from the warlike party's posts, and online war does not begin.

And what if both parties are warlike? Then the discussion turns into single branch, where both parties fight with each other.

So, at fully editable sites war begins only if both parties want war, whereas at usual sites war may begin even if all parties want peace.

Ambiguities of positive statements
Similarly to ambiguities of negative statements.

Ambiguities of ignoring
At least, 3rd type of ignoring (because of respect) becomes unlikely, since by editing you just add new versions, but do not change existing versions, so it is unlikely that you will disturb someone.

Popularity
The problem is that when you edit site, you make it more popular, including content you do not like. So, the opposite party can parasitize on you and your popularity, and you may act in favor of the opposite party.

But now, if you edit site, you do not edit opposite party's branches and they absent in your versions, so you do not make opposite party's posts more popular. Even on the contrary, you probably make them less popular, since the longer branch is, the more popular it is, and it is unlikely users will view all branches, probably, they will view only few branches, especially the longest branches.

So, opposite party's posts will encourage you to make new posts in order to make your branch longer and more popular (and, correspondingly, make enemy's branches less popular).

Exploitation of ambiguities
Return to the above example.

Troll: Please, delete your post. It was very unpleasant for me to read it. And do not make such posts again.

User: If it is unpleasant for you, why do you read this version of the site? Read some other branch of this site, which does not contain such posts, or create your own site version.

And troll will not find what to object. Moreover, since there are older and other site versions without this post, it is pretty obvious that this is just aggression rather than protest.

Separation of the warring parties
Two warring parties can be separated if at least one of them follows the rule: do not edit site version if it contains something you do not like.

Barriers
We no longer need barriers, since fully editable tree-like sites have the property of self-purification: although the site is fully open for newcomers, if friends follow the above-mentioned rule (at least some of them and at least sometimes), then completely free of foes posts branch will be created. This pure branch only with friends content will be created without any barriers against foes, without rules, without moderation, and without fighting against enemies.

Stagnation
If a new trend is born within online community, we no longer need to create separate site. The new branch for this new trend will be created spontaneously, when a someone posts something new, and users who like it edit this branch. Efforts will be spontaneously combined.

Off-topic
No need to prohibit off-topic, since it can be ignored just like foes posts.

Dynamicity
Now site versions are static, therefore users will not fear that a user's plan will be spoiled by the actions of other users. And no need to constantly keep an eye on the site to prevent unwanted edits.

Also, if you think that "in past this site was better", you always can return to any old version of this site and continue to edit it.

Knowledge, whether two posts have the same author
I think these problems can be solved with hidden accounts, that is author of a post is not displayed, so other users usually do not know who is the author, and what else did he post.

If user wants his nick to be visible, he can write his nick in the post himself. And if he wants to prove that he is the same author of several posts, he can add to the first post result of some operation that can be easily carried out in one direction, but can not be easily carried out in opposite direction, then add to the next post input of this operation and result of another operation with other input, and so on.

If user needs to send to another user a personal message, then he can "send personal message to author of certain post" instead of "send personal message to certain account".

If user needs to pay another user, then he can "pay author of certain post" instead of "pay certain account".

If moderator needs to ban a user, then he can "ban author of certain post" instead of "ban certain account". Or, if the offence is not very serious, then he can "impose penalty points on author of certain post", and if the author have enough penalty points, then server bans him automatically.

And so on.

Estimation of content based on the author's previous content
Since accounts are hidden and other users do not know who is author of a post, they estimate this post only on the basis of the post itself.

Vulnerability
Since accounts are hidden, you do not become celebrity and public person, even if you post a lot. And it becomes more difficult for your enemies to collect information about you and attack you, since they are not sure, are you author of a certain posts.

Inequality
Users do not know how many posts each of them created, therefore they perceive each other as equals.

Hate
Let's go back to the example: you communicate with friends in online community. Then hater comes and post hate comment.

What to do?

Again, just follow the rule "do not edit site version if it contains something you do not like".

That is countinue talk with friends, but not in hater's branch: return to last site version before hater came and talk in your own branch without hate comments.

So, you ignore hater, but now you also inform your friends that you do not like hater's post. They understand you and follow after you, that is they edit your branch, not hater's, so you know that they are with you, not with hater, and they did not betray you.

And now you do not look like a tyrant, since you do not suppress hater at all and do not interact with hater at all. Hater can continue to freely express their position, and eventually it will become clear if this is aggression or protest. And now your community do not look aggressive towards newbies.

So now hate comments instead of destroying your community can make it more solid.

Advantages of fully editable sites

 * Conflictless dissociation. You can express a negative attitude to anything without risk to be involved in a conflict, you just create a separate branch of the site.
 * Spontaneous creation of new trends and pooling of efforts. You do not need to create separate community for new trend, you can create branch for it directly within existing community, even if it is off-topic.
 * Self-purification. Since users with similar viewpoints do not edit foes branches, they can spontaneously create (and maintain) their branch completely free of unwanted content.

Disadvantages of fully editable sites
Disadvantages of fully editable sites are currently unknown, since they probably do not exist. But we may try to predict them.

Problem with fast growth rate
Recently I found a serious problem: let there is a large community of friends, and they want to often edit in single branch. But before editing each user should check previous edits, so growth of branch never reach rate when new edits appears faster than one user can check them.

There is a new "impossible three" for communities:
 * Fast growth rate
 * Single branch
 * Self-purification

So the community may choose one of three strategies by rejecting one of these elements:
 * Fast-growing strategy (or strategy with post-moderation): self-purification is rejected. Users do not check previous versions (for example, when someone makes an edit, the last site version in the branch is edited automatically). In fact, the branch becomes a "usual" site with all its problems. Unwanted content may appear, but then it may be deleted by the community members.
 * Middle-growing strategy (or strategy with pre-moderation): single branch is rejected. Users do not check all versions, but edit only checked versions, so, many branches appear instead of single branch, even if users like versions in other branches (they just can't check them all). Then someone can unite different branches by creating redirects to theirs page versions. But some useful edits may be lost.
 * Slow-growing strategy (or strategy without moderation): fast growth rate is rejected. Users check all versions, but do not do too much edits.

When a new community appears, it is small and follows slow-growing strategy. When it becomes larger, it may choose one of three strategies at the cost of rejecting of one of the elements. Then the community may change its strategy, or different users may follow different strategies.

Which version to view and edit?
Since there are many site versions, a user should choose, which version to view and edit.

Possible solutions: a user may view and edit any version until they notice any content they so not like. Or server can display any site version until user click "I do not like this version, show me another version", then server displays another site version, taking into account user's preferences.

Static versions
Since site versions are static, each time user type the same URL, they view the same not updated site version. To view something new, user should find some another site version.

Possible solution: create dynamic versions. Dynamic version is no more than redirect to some static version, but owner of the dynamic version can change it. So, user type the same URL of the dynamic version, and now the site is updated. When someone tries to edit dynamic version, they just edit corresponding static version.

And, for forementioned "fast-growing strategy", owner of dynamic version can make it open. That is when someone edits it, its redirect is automatically changing to the new created static version. In fact, we get "usual" site.

No one edits user's branch
Let a user creates a branch of site, but no one edit it.

Possible solutions: it is not necessary for user to continue to edit this branch. The user always can start to edit other more popular branches. If no one wants to continue user's edits, then nothing can be done. But if users do not see this branch (because of there are many site versions, and users cannot view them all), then we can make up something like in biological evolution horizontal gene transfer or sexual reproduction with crossing-over of different branches or something. For example, instead of finding last ancestor version of given page for given site version, we can use some more complex function of site version and page to find page version. This function may include: directly page version; site version, and then its last ancestor page version is found; or even current last version of the page (but in the last case the site version becomes dynamic).

Creation of new version of edited version
Let a user edits a site version, but while they edit, another user edits this version and saves the edit. Then the user also saves the edit, and the branch bifurcates. But the user would like to make these versions in single branch.

Possible solution: while user edits, server shows them, if new edits of the edited version appear. If they do, user can quickly view them, and make their edit child of a new version.

Also, user can create open dynamic version, that is each its new edit automatically becomes current version (but this branch becomes "usual site").

Branch attack
It is possible to do an attack: a foe creates many small branches within community, and it becomes difficult to find friend's versions among many foe's versions.

Possible solution: disallow for a user to create too many child versions of another user's version. If user needs to create many child versions, they can create one copy of the edited version, that is one child of it, and then create many child versions of the copy. (But still army of foes can do this attack. Currently I do not know how to solve this problem).

Is it possible
Is it possible to create such a site?

I think yes. In fact, it is version control system. Such software exist, for example, Git. Usually it is used in software development: programmers make edits, then theirs edits are united. But for our purposes the union is not so important: a program should be a single product, but a site may exist without some part, and site version may contain link to another site version.

I began to be interested in ordinals in late 2016, and before this, in late 2015 - late 2016, I was interested in such sites. I created prototype of such web engine, and it works. I used quite complex procedures, but in late 2016 I made up a way to do it easier, then I started to create new version of the web engine, but I did not finish it. Then I became interested in ordinals.

Do such sites already exist? I do not know, I did not find them.

How to create fully editable site
Now I'll share my experience of creating web engine for fully editable sites.

Versions are organized as binary trees, that is trees in which each element ("node") has no more than two children.

Note: I did not read anything about trees, so I made up my own terminology. For example, I call elements of trees "points" or "rank 0 nodes", whereas officially they are called "nodes". Also my trees grow upward like real trees (officially they grow downward), but this is not so important, at least, they can be flipped vertically.

Requirements
There are three requirements to the web engine:
 * quick view
 * quick editing
 * small disk space

That is server must quickly find and display page version from given site version and page, quickly save new edits, and site must not be many times larger than content at this site.

Highway and segment algorythms
The simplest algorythm is to physically create new site version after each edit, that is copy all pages, and replace copy of edited page with new version of this page. But it does not meet "small disk space" requirement (as well as "quick editing").

The other way is to create list of versions of each page, corresponding to new site version, after each edit. So, we make a table: columns are site versions, strings are pages, and in the table are page versions, corresponding to this page and this site version. I call it table algorythm. But it also does not meet "small disk space" requirement: let average size of page version is about 4 kilobytes, and page version is 4-byte number. Then, if there are 1000 pages, then size of this table is about of size of content. If there are 1000000 pages, then the table is 1000 times larger than content.

But this table should be easily compressible, since its columns are almost copies of each other, except one page. In fact, we need method of compression of this table such as it meets quick view and quick editing requirements.

I made up highway algorythm. It meets quick view and small disk space requirements. It meets quick editing requirement only in average, that is average time of saving of edits is quick, but sometimes edits are long saved. But it is rare, and the longer edit is saved, the rarely it happens.

Also I made up segment algorythm. For page views it is few times faster than highway algorythm, but it does not meet quick editing requirement. For this algorythm editing is very slow: in fact, after edit the whole table is re-compressed. So, it make sense to use combined highway-segment algorythm: the table is re-compressed not after each edit, but rarely, for example, one time per day, and for page views faster segment algorythm is used for "old" site versions, and slower highway algorythm is used for "new" site versions.

I made in web engine both highway and segment algorythms, and they both work. Also I made up four accelerations of segment algorythm, but I did not make them all in program.

Points and joints
There is binary tree of site versions, and separate binary trees of versions of each page.

Point is element of tree. Point is a version.

Each point has three joints:
 * parent joint
 * left child joint
 * right child joint

Child joint is left child joint or right child joint.

Using joints points can be connected to other points: child joint of a point can be connected to parent joint of another point. Parent to parent, or child to child joint cannot be connected.

Parent of point is point, connected to its parent joint.

Left child of point is point, connected to left child its joint.

Right child of point is point, connected to its right child joint.

Child of point is its left child or right child.

Point is left, if it is left child of its parent.

Point is right, if it is right child of its parent.

All points are enumerated.

Point 0 is "nonexisting" point. It is only point, which can be connected to many (more than 3) points at the same time.

Free joint is child joint, connected to point 0.

Tree root is point, which parent joint is connected to point 0 (that is it has no parent). Tree root is point 1. Initially every tree consists of one point - tree root (not counting "nonexisting" point 0).

Left child if point 0 is tree root (so, tree root is left point). Right child and parent of point 0 are point 0 itself.

Ancestors and descendants
Ancestor of point is this point, or its parent, or parent of parent, or parent of parent of parent etc.

Descendant of point is this point, or its child, or child of child, or child of child of child etc.

So a point is also ancestor and descendant of itself.

Relative positions of two points
There are two possible relative positions of two different points:
 * one point is descendant of another point
 * the points are not ancestor nor descendant of each other

One of the most important algorythms is to find out, whether one given point is descendant of another given point.

Way between two points (when one point is descendant of another point) is set of parent of "descendant" point, its parent, its parent, etc. until "ancestor" point. So, "ancestor" point is part of the way, but "descendant" point is part of the way.

Last common ancestor (lca) of two points is theirs common ancestor such as it has no descendant, which is also theirs common ancestor.

If one point is descendant of another point, then theirs lca is "ancestor" point.

If the points are not ancestor nor descendant of each other, then theirs lca is some another point.

Finding of lca of two given points is also one the most important algorythms.

Addition of new point to tree
Points are versions, and eacn version should be editable. So, to any point of tree a new point can be connected.

There are two ways of connection of new points:
 * free connection (new point is connected to free joint of edited point)
 * insertion (new point is inserted between edited point and its child)

There are three types of free connection:
 * double free (when both child joints of edited point are free)
 * single free (when only one of child joints of edited point is free)
 * difficult case (when there are no free joints of edited point)

And there are three types of insertion:
 * left insertion (new point is inserted between edited point and its left child)
 * right insertion (new point is inserted between edited point and its right child)
 * double insertion (new point is inserted between edited point and its left child)

The simplest case is "single free": you just connect new point to only free joint of edited point.

In "left insertion", "right insertion" and "double insertion" cases use the rule:

Chirality conservation rule: if you insert new point between edited point and its child, then left child must remain left, and right child must remain right, when it becomes child the new point.

In "double free" and "double insertion" cases you should choose, to which child joint of edited point connect new point. In these cases use the rule:

Chirality inheritance rule: if you edit left point, then new point also should be left, and if you edit right point, then new point also should be right.

Fictive points
Now about "difficult case": we want to do free connection to edited point, but both its child joints are already busy. In this case first insert fictive point, then connect new point. You can do it three ways:
 * left way: do left insertion of fictive point, then connect new point to fictive point
 * right way: do right insertion of fictive point, then connect new point to fictive point
 * double way: do double insertion of fictive point, then connect new point to edited point

Which way to use? It depends on which tree you are editing: site tree or page tree. If you edit site tree, then you can use any of these ways. (But measurements showed, that when "double way" is used, then page views is slightly (less then 1%) faster than when using "left" or "right" way. So, use "double way").

But if you are editing page tree, then you should choose certain way, otherwise web engine will not work properly. How to choose right way, I'll tell a bit later.

Nodes, cells, hierarchies
(Ok, I think I wrote enough today. I'll try to continue later).