Vim и потеря данных в NeoVim
В посте на Mastodon компьютерный учёный David Chisnall рассказал историю, которая хорошо иллюстрирует проблемы с инженерным подходом к разработке:
Я использую vim примерно с 2000 года. Написал пять книг, кандидатскую диссертацию, несколько десятков статей и более 150 артиклей с помощью vim. На этом этапе мой мозг уже не задействуется при вводе обычных команд vim — они просто срабатывают. Документы, написанные в других редакторах, содержат случайные :w посередине.
Основной его рассказ касался функции persistent undo в vim:
Persistent undo — одна из моих любимых фич vim. […]
Мне редко нужна функция persistent undo. Но в тех немногих случаях, когда она требуется, она бывает бесценна: ой, я случайно удалил что-то из файла, может быть, неделю назад и с одной перезагрузкой назад, что это было? Отменяю операции, пока не найду это, копирую, вставляю в текущую версию. Или чаще: у меня это работало, потом я привел код в порядок перед commit'ом, теперь не работает, что я сделал?
Vim сохраняет это на протяжении больших апгрейдов версий уже около 20 лет. Я даже не думаю об этом — это просто часть первого закона Raskin: программа не должна вредить данным пользователя и не должна бездействием допустить вреда этим данным. Если vim или компьютер упадут, или если я закрою файл и вернусь к нему через полгода, моя история отмен все еще там.
Что произошло с NeoVim
NeoVim — это форк vim (существующий по другим причинам). Chisnall попробовал его на ранней стадии:
Так что я попробовал NeoVim, когда он был совсем новым. Vim, который ты уже знаешь, но лучше? Отлично!
Первое, что я заметил в NeoVim — отмена не работала. Я попробовал открыть файл в vim, и отмена не работала там тоже.
Neovim изменил формат файлов отмены. Он не обновил старый. Он не использовал другое имя для своих файлов отмены. Он просто заметил существование файла отмены vim, удалил его (потеряв все данные в нем) и заменил его на то, что vim не мог прочитать.
Я создал issue об этом и мне сказали, что формат persistent undo нестабилен и пользователи не должны полагаться на то, что данные сохранятся в функции, явно называемой persistent undo. Он изменился один раз и, вероятно, изменится снова.
На этом мой опыт с NeoVim закончился. Авторы сразу же продемонстрировали, что им нельзя доверять никакие мои данные. Нарушение persistent undo можно было бы простить как баг, но убеждение, что просто потому, что что-то — это файл на диске, содержащий данные, которые пользователь может захотеть, это не причина для программы не удалять его — означало, что у них не было никакого понимания своей ответственности перед пользователями.
Почему это важно
Этот пост стоит прочитать целиком, потому что он затрагивает несколько важных моментов:
- Функция persistent undo, работающая таким образом, кажется потрясающей — и это удивительно, что про неё мало кто слышит.
- Люди действительно помнят, когда программное обеспечение теряет результаты их работы или не уважает их.
- Фраза «Он изменился один раз и, вероятно, изменится снова» действительно пробирает — она показывает глубокую безответственность.
Законы Raskin
Пост примечателен и появлением закона Raskin. Jef Raskin, легендарный дизайнер интерфейсов из Macintosh и Canon Cat, сформулировал три закона в своей книге 2000 года The Humane Interface:
- Компьютер не должен вредить вашей работе и не должен допускать ущерба ей через бездействие.
- Компьютер не должен тратить впустую ваше время и не должен требовать от вас больше работы, чем строго необходимо.
- Интерфейс гуманен, если он чутко реагирует на человеческие потребности и учитывает человеческие слабости.
Эта книга была очень важна для нашего понимания хорошего дизайна. Удивительно, что эти принципы не попали на Unsung раньше.