Author: Youngjin Kang Date: October 20, 2026
In our introductory volume (i.e. volume 1), I suggested separating out a portion of the codebase and treating it as a special place reserved for human engineers. And in order to assign an indispensable role to it, I hinted at the importance of equipping the human-reserved code with a human-specific intention which is not quite parallel to that of an AI agent at least within the scope of a locality of human beings.
A major problem is that defining the volitional elements of a software product seems to be a monumental task which encompasses a rich spectrum of interdisciplinary subjects, such as arts, humanities, and philosophy. And because of this broadness in context, it is easy for an engineer to be perplexed by the apparent lack of connection between daily software engineering practices (e.g. technical design, documentation, programming) and ideas in the liberal arts.
What we ought to do foremost, then, is to discover such a connection - i.e. a layer of translation between the underlying morals of human nature and its rational symbolism. And in order to do this, we need to establish a habit of expressing seemingly irrational concepts (e.g. emotions, personalities, aesthetics) in terms of mathematical ideals.
As the handling of domain-specific knowledge is being overtaken by LLMs, it seems natural to expect engineers to look for inspirations in general topics which do not quite fit inside the rationality of classical software development. Due to this apparent conflict between two schools of thought, many people tend to cling to either of the two extreme viewpoints - the pessimism of a Luddite and the optimism of a tech enthusiast. The former believes that computer science will slip out of our hands unless we exclude AI from our work entirely, and the latter believes that this new industrial revolution is simply a prelude to a new paradigm in computer science.
Such a dichotomy, however, ought to be taken as a lazy means of bypassing the most urgent question, which is: "What do we need to do now?" What we should be demanding is a practical solution, rather than an ideal which applies to only a select few individuals. Saying that you must isolate yourself from the AI-infested world cannot be an answer unless you are planning to become a hermit. Suppressing the usage of AI by means of regulation will only work as a temporary remedy because, as long as not everyone is subject to regulation, there will always be a risk of being run over by external competitors. Saying that you must simply follow the latest trend in technology, on the other hand, only lets charlatans get richer by selling buzzwords and generic catchphrases, while keeping the audience uninformed and thus easily manipulable.
It is necessary, therefore, to take a step back from such single-minded generalities and look for a pragmatic method of overcoming our present difficulties. The most pressing problem we need to solve in the context of software development is that of achieving a point of compromise between computer science and general humanities for the sake of keeping our spirit of computational thinking alive while also staying flexible enough to handle problems in multifaceted ways.
On a holistic level, both computer science and humanities belong to the same vein; it is the sense of human intentionality from which both of them originate. The highest challenge lies in the problem of coming up with a language which speaks both of these disciplines at once.
One major clue can be found in the word "narrative". It is the concept which plays a central role in the design of user experience (UI/UX), and is something which nearly everyone, who is in charge of developing and maintaining the project, should be familiar with regardless of one's field of expertise. Through the user's story, the product builds its own irreplaceable points of attraction apart from its functional side.
Yet, the very idea of branding a product by means of storytelling does not translate easily into design details. As a result, an inexplicable gap between "people who understand the customer" and "people who know how to make things work" is bound to arise, as long as we are content with the notion of a narrative as a mere queue of case-by-case needs.
In order to resolve this lack of structural integrity, we need to figure out a way to model the product's narrative from a rational standpoint; this way, we will be able to treat it as part of a single coherent system. This is the core philosophy which will empower engineers to directly control the full course of user interaction.
When it comes to treating a narrative systematically, it is requisite to decompose it into elements which are endowed with a sense of mathematical purity.
One may insist that a narrative is supposed to be meaningful in ways which cannot possibly be expressed in terms of quantitative definitions, and that any attempt to do so will eventually result in a false replica of the subtlety of human nature. Such an argument may yield a decisive conclusion to those who do not understand the virtue of abstraction and are quick to discredit a general statement under the presence of "exceptional cases"; but if we are to use this kind of sentiment as an excuse to dismiss the merit of an attempt to provide a rational explanation for something which feels irrational, there will equally be no reason to employ the language of mathematics in the research of complex human activities such as economics, politics, and experimental psychology.
The matter of how far we can stretch our rationality, though, is not of the highest priority right now. The most important question we need to ask at this point is, "What are the basic building blocks out of which a narrative is composed, which are so pure in their characteristics that they can be part of a computational process?" This is the crux of the problem, and it is what I am going to answer now.
You and I probably have different ideas when it comes to the question of what a narrative really is and what its ultimate goals are. Still, however, we can both agree on the point that every topic we are ever going to discuss needs to have its own definitions. By defining things, we enchant words with their special meanings, each of which can be summoned as a solid image in our architecture of imagination.
The most primitive type of definition is that of identity. In our everyday lives, we often say that something "is" something else, or that something "is not" something else. This reminds us of the nature of dualism in our logic.
In Alice's Adventures in Wonderland, we have a number of characters and they all possess their own identities. For example, Alice is a human and Dinah is a cat.
Alice is a human.
Dinah is a cat.
In a programming language, Alice and Dinah are both objects while human and cat are classes (categories) of objects. Human is a class to which Alice belongs, which implies that Alice is an instance of human. Cat is a class to which Dinah belongs, which implies that Dinah is an instance of cat.
class Human {}
class Cat {}
const alice = new Human();
const dinah = new Cat();If we are to stretch this concept further into chains of indirect definitions, we will eventually end up seeing that identities which differ on a surface level may ultimately originate from their common ancestor. For example, we know that Alice is a human and Dinah is a cat, but do we know what we mean by "human" and what we mean by "cat"? What exactly is a human anyways? And what exactly is a cat?
If we put aside the comprehensive library of details in evolutionary biology and the full taxonomy of species which it yields, we may proceed to model our worldview in a rather simplified manner by conceiving yet another word which could be accused of being "way too general" but is not nonsensical either. In general, both humans and cats may be classified as animals. Alice is a human and Dinah is a cat, yet they are both animals because a human is an animal and a cat is an animal too.
Alice is a human.
Dinah is a cat.
A human is an animal.
A cat is an animal.
And it happens that animal is a class, too, since it functions as a means of classification just like human or cat does. Unlike human or cat, however, animal should be considered more abstract because the identification of Alice and Dinah as "animals" is more indirect than those involving the words "human" and "cat".
An animal is a more abstract representation of a human, as well as a more abstract representation of a cat. As a result, we say that a human or cat is a more concrete case of an animal, whereas an animal is a form of generalization whose definition applies to both of them without introducing any logical absurdity.
class Animal {}
class Human extends Animal {}
class Cat extends Animal {}
const alice = new Human();
const dinah = new Cat();Oh, but guess what? Dinah is not just one of those stray cats on the street; she is Alice's cat. Alice owns her, so it makes sense for us to say that Alice has Dinah.
This is a different sort of relation from the ones which involved the word "is". Indeed, Alice is not Dinah and Dinah is not Alice; they are separate beings. Yet they are still bound together by their mutual bond, which is associated with the notion of ownership and dependence.
Alice is a human.
Dinah is a cat.
Alice has Dinah.
Another way of putting it would be that Alice owns Dinah and Dinah is owned by Alice. This kind of expression often manifests itself in the form of member variables in class definitions, which can be quite specific in meaning and be capable of changing their states over time. For instance, we may generally state that a human is able to own an animal as a pet, and that a cat is able to be owned by a human.
class Human extends Animal
{
pet: Animal;
}
class Cat extends Animal
{
owner: Human;
}What we are seeing is a pair of references, one of them being held by a human and the other one being held by a cat. The presence of these fields called "pet" and "owner", by means of their semantic implications, suggests that a human is capable of having any animal as a pet, as well as that a cat is capable of having any human as its owner.
This naturally leads us to the idea that Alice, a human being, must be able to have her own pet. And guess what her pet's name is? Dinah! Meanwhile, Dinah is a cat, so she must be able to have an owner, who happens to be Alice.
We can establish such a pair of relations by saying "Alice's pet is Dinah, and Dinah's owner is Alice", which is syntactically more verbose than a general statement such as "Alice has Dinah" but retains its merit as a richer piece of illustration.
const alice = new Human();
const dinah = new Cat();
alice.pet = dinah;
dinah.owner = alice;
We know that Alice has Dinah as her pet. Yet, what might be bugging us at this point is that the way we conclude that Alice "has" Dinah, based on the fact that Dinah is Alice's pet and Alice is Dinah's owner, feels rather too implicit. Therefore, it is reasonable to insert an explicit piece of logic (member function) which tells us that any human "has" the pet he/she owns.
class Human extends Animal
{
pet: Animal;
has(animal: Animal): boolean
{
return this.pet == animal;
}
}This is a convenient way of establishing means of simplification - i.e. a facade of encapsulation which hides details behind it and only exhibits the purest essence of what needs to be conveyed. While the statement "Alice's pet is Dinah and Dinah's owner is Alice" is technically correct, it appears to be rather verbose and tainted with unnecessary crumbs of information. Replacing such an exhaustive depiction with a minimal expression (e.g. "Alice has Dinah") is how we optimize our methods of communication.
What is demonstrated below, for instance, proves the elegance of using a single predicate called "has" to state the relation of ownership between Alice and Dinah without explicitly mentioning the word "pet" or "owner" upfront.
const alice = new Human();
const dinah = new Cat();
alice.pet = dinah;
dinah.owner = alice;
console.log(alice.has(dinah)); // Output: "true"Another question may arise by now. What if we also want to mention that Alice has both Dinah and Kitty as her cats? For sure, this will suggest that we must have yet another cat called Kitty besides Dinah, and that there must be some kind of parallel between the way Alice is related to Dinah and the way Alice is related to Kitty. Just like Dinah, Kitty is a cat and Alice owns her.
Alice is a human.
Dinah is a cat.
Kitty is a cat.
Alice has Dinah.
Alice has Kitty.
Such a multiplicity of information can be achieved by expanding our definition. Suppose that a human is able to have a multitude of pets, not just one. This will be equivalent to having an array of pets rather than just a single pet. The "has" predicate, then, will be responsible for telling us that the human "has" the given animal as long as at least one of the pets happens to be that animal.
class Human extends Animal
{
pets: Animal[] = [];
has(animal: Animal): boolean
{
return this.pets.some(pet => pet == animal);
}
}Since Alice is a human, we can now let Alice have multiple pets. If we are to say that Alice owns exactly two pets called Dinah and Kitty, the most accurate way of putting it will be that Alice's "pets" is an array of two pets; the first element of the array could be Dinah, while the second element of the array could be Kitty.
const alice = new Human();
const dinah = new Cat();
const kitty = new Cat();
alice.pets = [dinah, kitty];
dinah.owner = alice;
kitty.owner = alice;
console.log(alice.has(dinah)); // Output: "true"
console.log(alice.has(kitty)); // Output: "true"
Things which have been illustrated so far, however, are mere statements which tell us of things out of which the world is made and how they are related to each other. As you may have already noticed, this is hardly anything more than a static snapshot of what is going on in our surroundings, which does not reveal the prospect of how things ought to behave and what their ultimate destination is, as well as the moral implications of what we are wishing for and what we are trying to avoid.
The logical constructs which I have introduced in this volume, therefore, only fill up an incomplete picture of a narrative. In order for a story to unfold organically and in a manner which convinces our heart of motivation - that is, to come up with something valuable (i.e. an objective which the audience deems worthwhile to pay attention to), we need to appeal to what are called "passion", "emotion", as well as myriad other fragments of subjectivity which do not seem to be quite compatible with a framework of reason established by hard science.
To overcome this lack of compatibility, we must invent a whole new language which neither the most sentimental poet nor the purest mathematician has been consciously speaking so far. Such a language ought to (and must) wake us from the intellectual lethargy of this new dark age.
Being new, however, does not require alien words. We can keep using words which are already familiar to us. The real difference lies in the subtlety of their inner meaning, which is what I am going to demonstrate with clarity in the upcoming volumes.
Previous PageDoor image by xadartstudio
© 2019-2026 ThingsPool. All rights reserved.
Privacy Policy Terms of Service