White-Collar AI Apocalypse Narrative Is Just Another Bullshit

Here is an exercise in critical thinking.

According to Dario, “two years ago AI was at the level of a smart high school student, now it’s at the level of a smart college student1. Customer Support market must be obliterated by now? Except it is bouncing back since the middle of 2025 and is now just below the pre-Covid levels (aka normal levels)2?

Customer Service Job Postings on Indeed in the United States

There were two years (which is a millennia for a 100x engineer) during which companies could have connected a heavily subsidized OpenAI model to a RAG and just fired everyone. Instead half a year ago they started hiring people back?

The only rational conclusion here is that you need a PhD level AI to replace a customer support agent.

Anecdotally, I have recently watched an ex-big-tech engineer explain how his team built an internal app that could automate 90% of the customer support cases using LLMs plugged to the company’s CS knowledge base. Even though they succeeded to automate 90% of the cases, the project got binned. Why? Because the remaining 10% is what required most of the CS team’s time. They built an FAQ you can talk to.

There are more anecdotes like this. You can go on Reddit and look for how the customer support is surviving in these tough AGI times. This is a common theme:

Anecdotes are funny, but is there anything that the AI hype machine is conveniently missing about the white-collar jobs? For example, the fact that all of them are semi-decidable, and the economics of semi-decidable jobs follow the 80/20 rule?

Semi-decidable jobs don’t have an algorithm. You can enumerate decidable cases and later when you see them again, just recall. This is experience. It makes you faster at your job. It is also something that can be automated. Decidable cases are fast and cost little.

The problem is with the undecidable cases that come your way. You don’t know that they are undecidable, maybe they just take a bit longer. How much longer? Maybe a day, maybe a week. Maybe a bit longer than that. Undecidable cases have infinite costs, makes you go to war and in theory are unsolvable.

Generally, we dovetail:

  1. Take task X from the new tasks queue. If there aren’t any, take X from a backlog.
  2. Spend T amount of time on X.
  3. If X is not solved within time ≤ T, move it to the backlog and go to step (1).

Undecidable cases are rare, but consume most of the costs.

In order to have an excuse to add a cool color gradient, suppose a semi-decidable job of categorizing red and green ribbons. There is a continuous conveyor sending ribbons your way. All the ribbons come from a color spectrum between red and green. 80% of the ribbons cause no problems, because they are clearly either red or green. The rest 20% are the opposite. Are they red or are they green? Fuck knows.

At some point you just have to give up and invent a new color. But this requires out of the context thinking.

Software engineering is no different. The majority of the work we do we can do drunk. It is that one boolean flag in the new Rails config that can take the whole operation down after the upgrade. This is what takes days of work, checking, rechecking, white-boarding, waterboarding and going back on the meds.

UPDATE: 2026-03-24

I admit, the software engineering argument was a bit weak, mainly because I wanted to keep a half serious tone for the article, and also to keep it short. It is hard to generally defend the whole programming profession considering how heterogeneous it is. Since this article blew up on Hacker News, and that I am still pretty confident to be right, I will continue to update this article with quality examples. Here is one.

In web scraping, humans write and supervise the robots that do the scraping. Recently, I built a small prototype using GPT models, that could automate the robot writing. The proof of concept would take a URL and a list of attributes and would write code that scrapes the page. It worked. There were also a lot of low-hanging fruit to make it even better. I could also see how the supervision part could be automated. But here is the problem: 90% of the robot writer’s time is not actually spent on writing code that extracts the data (even though this is the majority of the robot’s code). Most of the time is spent trying to figure out how to avoid getting blocked. This is a cat-and-mouse game, and you can’t automate it. There is literally somebody just as smart as you on the other end coding against you.

  1. https://www.youtube.com/watch?v=SvK03dPM6ho ↩︎
  2. The general downtrend we can ignore, since even Food & Serving (the most AI-proof profession according to Anthropic) has it. So does the whole US economy in general. ↩︎

On Street Photography and Writing

Fan Ho, Smoky World; 1959

Looking into photos of street photography seems to have an interesting effect on my writing.

I wouldn’t call it inspiration. It rather puts me into the right state of mind.

On paper what writing and photography share is that they both try to capture the reality in order to communicate it to others. They do it via framing — capturing a finite slice of infinite. But this is impossible.

It is impossible to capture the reality half-way, 1% or 10^{-9}. We are talking about infinity.

To me this has always been demoralizing. Every time I try to frame something, it keeps escaping. Then I try again and again. It’s always shit. All you get is shit. It’s just disappointment. Like trying to take a picture of mountains — “as soon as you put a border on it, it’s gone”1.

For this reason I like to meditate on great of street photography. It shows me what I am doing wrong. As a novice I try to cram as much of the reality as I can. Masters don’t do that. Instead they paint a different reality in which time is frozen. There is no time dimension in their world. Great photographers don’t try to master capturing reality, instead they create a new universe of which they are the masters.

Fan Ho, Honk Kong Venice; 1962
Raghu Rai, Mumbai; 1995
  1. Zen and the Art of Motorcycle Maintenance by Robert M. Pirsig. ↩︎

Cryptography Notes #1

Encryption & Signatures

  • public key = (e, n)
  • private key = (d, n)
  • e, d, n are numbers.
  • m — message and it is <= n (messages <=> numbers).
  • RSA is a block cipher, so a message is split into blocks b_i where b_i <= n.
  • For simplicity we can assume that our message fits into a block.

Encryption

c = m^e (mod n)

Think of a circle with n points, m^e starts at a point m and wraps around the circle x amount of times and stops at point c. c is a cryptogram.

Decryption

m = c^d (mod n).

c^d starts at a point c, wraps around the circle x times and stops at point m.

To compare, Caesar cipher is:

c = (m+e) (mod 26)

m = (c-e) (mod 26)

Digital Signature

  • Decrypt a hash h and receive s (or signature)
  • Transmit (h, s)
  • The other party who has your public key can encrypt s and receive h’. If h == h’, then s could have only been generated by the owner of the private key whose public key you have.
  • If the decrypt/encrypt sounds strange — if the other party were to send enc(s) = h, you could decrypt it to obtain s.

Bitcoin multi-sig address

To spend funds stored in a m-of-n multi-sig address, you need to create a transaction that has >= m required signatures, then broadcast it.

L2 channel

1) A and B put money into a 2-sig address.

2) Construct a transaction that distributes the money from (1) to A and B:

OUTPUT 0 <5 BTC>: <X's Public Key> CHECKSIG
OUTPUT 1 <5 BTC>:
IF
# Revocation penalty output
<Revocation Public Key>
ELSE
<1000 blocks>
CHECKSEQUENCEVERIFY
DROP
<Y's Public Key>
ENDIF
CHECKSIG

3) A and B have version of (2) signed that favors them (e.g. they are the party X that gets their funds immediately).

4) A and B have 1/2 of the secret key whose public key is the revocations public key.

5) Because of (4), (2) can be invalidated by the non-favored party sharing their part of the secret revoke key. If the non-favored party were to sign the transaction that favors the other party, money from the 2-sig address would be split into two UTXOs, both of which could then be unlocked by the favored party. This make (2) invalid.

6) It is important to agree on the new version of (2) before (5). Otherwise if the favored party goes offline, the non-favored party would not be able to get their money back, since invalid version of (2) is all they would have. They can risk it, but if in 1000 blocks the favored party were to come back online — gg.