Чем глубже я погружаюсь в то, как устроен Notion, тем больше мне кажется, что его создал безумный гений.
Есть такая игра Prince of Persia, 1989 года выпуска. Её создал всего один человек, и это технический шедевр, а также игра, которой не должно существовать, во всяком случае не в том виде, в котором она существует.
Джордан Мекнер в свои 25 лет сотворил что-то невозможное и создал сложную игру, которая даже спустя 36 лет с момента создания выглядит неплохо, при том что для её запуска требовались всего 4 килобайта оперативной памяти и 1 мегагерцовый процессор Apple II. Полную историю создания смотрите здесь.
Как связаны Prince of Persia (1989) и Notion (2016)? Оба не должны существовать.
В последний месяц я часто сталкиваюсь с тем, что многие не понимают, насколько Notion — сложный продукт. Notion настолько сложен, что его просто никто не может повторить.
В нашем мире ужасной конкуренции, где есть:
- Десяток «ТикТоков»: Youtube Shorts, Instagram Reels, Snapchat Spotlight, Likee, VK Клипы и другие.
- Миллион дейтингов: Tinder, Badoo, Bumble, Hinge, Pure, Grindr, Mamba, LovePlanet — на любой вкус и цвет.
- Бесконечное количество разных моделей: ChatGPT, Claude, Gemini, Llama, Grok, DeepSeek, Qwen...
При этом Notion будто в отдельной лиге. Кто его конкуренты?
Coda? Слишком урезанная и багованная.
Obsidian? Борется за другой рынок.
Buildin? Поделка на коленке в попытке захватить часть рынка, которая освободилась благодаря санкциям.
У Notion нет конкурентов.
И это напрямую связано с его сложностью: Notion тупо почти нереально скопировать. Это удивительный продукт. В мире, где банальные баги в банальных продуктах не фиксятся годами, у нас есть доступ к невероятно сложному сервису, который по большей части работает идеально.
Ребята из Notion не идут на компромиссы: они хотели сделать идеальный редактор — они его сделали. Notion — это проект мечты, над которым работали ночами.
Это видно даже в таких мелочах, как фейковое выделение.
В чём суть? Редактирование в Notion — это костыль. Когда создатели HTML-спеки давали возможность редактировать стандартные HTML-блоки, то никто не мог предположить, что через 20 лет на основе этой идеи появится Notion, в связи с чем даже самые базовые взаимодействия приходится создавать самостоятельно.
Но ребятам из Notion было глубоко пофиг, ведь они делали проект мечты. Так что, когда они встретились с очередной проблемой редактируемых блоков, а она заключалась в том, что стандартное браузерное выделение сбрасывалось, когда открывалось поле для ввода ссылки, они просто сделали фейковое выделение...
И может показаться, что в том, чтобы нарисовать прямоугольник позади текста, имитирующий выделение, нет ничего сложного, и это действительно так. Но когда ты понимаешь, что у этого прямоугольника нельзя задать фиксированную высоту, в связи с чем приходится рисовать его с помощью теней. При этом тени должны быть не в высоту текста, а в высоту строки, потому что браузерное выделение рисуется в высоту строки. Также тени нельзя просто взять и нарисовать позади текста, так что отдельно под высоту текста нужно рисовать отдельный прямоугольник, а вокруг него — идеально прилегающие тени. Если немного промохнёшься, получишь либо дырки, либо наложение полупрозрачных прямоугольников друг на друга... а потом ты вспоминаешь, что у тебя есть элементы разной высоты в проекте, и сами пользователи могут поменять размер шрифта, поэтому вычислять нужно динамически. Но, выдохнув и пройдя весь ад, ты понимаешь, что твоё решение не работает, если пользователь выделелил несколько строк вместо одной, и тебе нужно переделывать его, чтобы учесть этот сценарий.
Как я узнал обо всём этом? Я реализовал почти идентичную логику в Blok. Если сравнивать браузерное выделение и выделение в Blok под лупой, можно увидеть небольшия отличия. А в Notion — нет. Сколько я ни пытался, я не увидел разницы.
Вот именно из-за такого подхода у нас никогда не будет второго Notion. Разве что какой-то другой безумец не доведёт до идеала один свой open-source проект.
Post #41
215

- 🔥 7
- ❤ 3
- 👍 2