?

Log in

No account? Create an account

Стой под стрелой

Поступки и мысли, о которых могу вспомнить не краснея

Категория: компьютеры

ICFPC 2019
tonsky

В этот понедельник закончился трехдневный марафон под названием ICFPC. Это такое соревнование, где команды программистов со всего мира пытаются на время как можно лучше решить некую задачу. В этот раз – обход лабиринтов с разным доп. инвентарем. Условия можно прочитать здесь. Это как бы отчет, но на самом деле памятка самому себе на случай, если буду играть еще через год.

Мне очень понравилось. То есть я конечно устал как собака, но есть что-то приятное в том что этот опыт а) имеет конечную продолжительность, а не тянется годами, как основная работа. И б) можно полностью отдаться задаче, не думая о том зачем это все и что ты делаешь со своей жизнью. Такой вот повод упоенно фигачить на полной скорости какое-то время, чтобы ветер свистел в ушах. Ну и просто весело.

Очень любопытно посмотреть, чего ты стоишь. В голове-то ты мог много себе про себя нафантазировать, а тут вот объективная реальность, ладдер, и ты либо можешь компьютер заставить делать что ты хочешь, либо не можешь. Никаких «если бы», никаких «возможно, наверное, мне кажется». Мы довольно посредственно выступили (на момент закрытия 29 место из 142 участвовавших, в лучший свой момент были на пятом).

Исторический скриншот. Дальше мы сильно сдали
Исторический скриншот. Дальше мы сильно сдали

Участвовали втроем, я в первый раз. Как я понял, средний размер команды ~5 человек, не редкость и восемь встретить. Втроем у нас довольно хорошо делились области ответственности, было бы больше появился бы организационный оверхед (как мне кажется). Восемь человек я бы вообще офигел менеджить и вообще ничего бы не написал, наверное. С другой стороны, больше рук – можно попробовать больше подходов. Можно вложиться в инфрастуктуру. Наверное.

Задача достаточно нетривиальная, чтобы решить ее до конца было в принципе невозможно. Но и не супер-сложная, чтобы как-то ее решить можно было бы даже иногда и руками (ну, самые простые примеры). Как правило это значит перебор вариантов в каком-то NP-полном поле, соревнование эвристик.

Собери бонусы, закрась лабиринт
Собери бонусы, закрась лабиринт

Clojure, несмотря на все плюсы языка высокого уровня и быстрого iteration time, по ощущениям подошла довольно плохо. Потому что все упирается в перформанс. Можно сколько угодно рассуждать про «глобальные оптимизации против локальных», ненавидеть байтоебство, мыслить как стратег с высоты птичьего полета и гордиться тем, что не знаешь, как устроен компьютер, но это все и в императивных языках можно делать. Они же не отнимают способности мыслить и планировать. Да, механика записи мысли чуть более многословна, ну зато оно того стоит. Плюс за три дня вы разницы может и не заметите даже. А вот по перформансу заметите, еще как. Как ни крути, а команда, которая обсчитает за условное время X в два раза больше вариантов, чем ее конкурент, будет в топе выше. КАК НИ КРУТИ. Больше здесь строго лучше. Либо больше итераций, больше вариантов попробовать, либо решения будут более глубокими, а значит и очков принесут больше.

ICFPC это как раз такой случай, когда лучше чуть больше устать но получить программу которая будет нагружать процессор по делу, а не только мусор за юзером подбирать. К тому же, как ни странно, старые императивные языки может и не очень легко позволяют до энтерпрайзных масштабов раздувать программы, но что-что а бегать по массивам и мутировать структуры они похлеще функциональных могут. Ирония – соревнование приурочено к конференции по функциональному программированию, а побеждают в нем все стабильнее C++ и императивщина.

Выглядит красиво, жаль вся эта мощь обслуживает всякое говно вроде lazy sequences, primitive boxing, high-order functions вместо того, чтобы решать задачу
Выглядит красиво, жаль вся эта мощь обслуживает всякое говно вроде lazy sequences, primitive boxing, high-order functions вместо того, чтобы решать задачу

Сейчас я думаю, что даже если бы мы выбрали просто Java с unboxed примитивами и примитивными массивами, было бы качественно лучше. C++/OCaml/Rust может быть дали бы еще 1,5-2 раза прирост, но это уже не изменило бы ситуацию качественно. Но может и нет, цифры так, с потолка.

Про типизацию – да, было определенное количество багов, связанных с опечатками и лукапами не в тех структурах. Конечно типы бы от этого спасли. Но был и интересный момент, когда под конец соревнования понадобилось кардинально поменять интерфейс решателя задач, и вот тут отсутствие типов позволило мне зарефакторить решатель, оставив генератор (вторую большую часть программы) на старых структурах. В статически типизированном языке мне пришлось бы рефакторить всю программу целиком, что съело бы ценное время. Конечно, это просто забавный аргумент, курьез, я его привожу тут только потому, что все остальные традиционные скучные примеры традиционно указывают в обратную сторону.

Да, я думаю именно в этой ситуации—сверхинтенсивной коллаборации над одним маленьким сверхчасто редактируемым куском кода—типы бы больше помогли, чем мешали — их нужно немного, по сути это структуры даже просто, которые спасли бы от глупых опечаток. В более спокойной обстановке, без цейтнота, оба примера, и опечатки, и рефакторинг, не имели бы такого веса, когда есть и тесты, и время сделать все нормально.

Кстати, многие ошибки, которые все-таки у нас были, были связаны с подстановкой переменной того же типа, где никакая система типов бы никого не спасла. Ну оно и не удивительно, когда у тебя большая часть программы, процентов 90, гоняет инты направо и налево. Это же алгоритмы.

не с этого хакатона, но смысл такой же
не с этого хакатона, но смысл такой же

Очень важно оказалось докапываться до причин каждой странности. Удивительно, на самом деле, насколько программа может как-то работать и выдавать решения, имея локальные проблемы и ошибки в каких-то местах. Почти как нечто живое, выживающее. Пару багов мы поймали просто глазами, когда увидели, что бот иногда на пару ходов ведет себя странно, хотя и решает в итоге все задачи.

лабиринты, генерируемые нашим алгоритмом, имели хорошо узнаваемый вид
лабиринты, генерируемые нашим алгоритмом, имели хорошо узнаваемый вид

Очень важна базовая гигиена. Ну там код неиспользуемый удалять, переменные нормально называть, на функции разбивать нормально где нужно, не писать по два-три раза почти одно и то же, если уже написано. Казалось бы, тоже — хакатон, вы через три дня все это выкините, так ли это важно? Вот оказалось что да. Потому что там где в обычном проекте косяки может через полгода-год всплывут, здесь если ты что-то поленился, коллега уже через полчаса об это споткнется. Причем споткнется обязательно, потому что кода мало и все используют всё постоянно. Так что лучше пять минут потерять, но поправить самому, пока контекст у тебя в голове, чем заставить коллег тебя материть и тебя же дергать. Чисто по времени выгоднее. Несмотря на.

Пилу нужно точить. Как бы ни казалось, что три дня уж без удобств можно прожить, удобства все-таки решают. Мы очень страдали от отсутствия визуализатора. Организаторы предлагали готовый, но в браузере (на ScalaJS кстати), и это не оч удобно было (для каждого запуска нужно было накликать мышкой и выбрать два раза через диалог выбора файла два файла).

Визуализатор организаторов
Визуализатор организаторов
ух как же меня бесило выбирать эти файлы каждый раз!
ух как же меня бесило выбирать эти файлы каждый раз!

Самое большое, чего там не хватало — пошагового реплея, перемотки назад и вперед, ну и доп информацию тоже иногда хочется какую-то вывести. Как разбился лабиринт, что думает бот, такое. Я написал в какой-то момент простой визуализатор через println и clear screen, он даже мультики показывал типа, но хотелось бы чего-то более удобного и универсального.

То же самое касается проверок на ошибки, на тупизну, на то что задача в принципе дорешивается. Причем желательно чтобы это был код независимый от основной codebase — какое-то довольно продолжительное время мы отправляли задачи и не знали, что часть из них тупо не принималась организаторами, хотя мы думали, что все решили. Тесты, конечно, писать некогда. Но вот ассерты, ассерты помогают. Иногда как раз такие странные косяки ловить, когда вроде и все еще работает, но какое-то ожидание нарушено, и значит где-то что-то пошло не так, как ты думал.

Приходить надо было подготовленным. У ребят, например, из контура, была инфраструктура заготовлена: сервера, гоняющие задачи, сбор ответов, дашборд, сравнение. Мы этого, конечно, не знали, у нас в лучшем случае запустил программу на ноуте — в терминал вывалился результат. Пик инфраструктуры.

Очень пожалел, что не сделали систему сбора и записи всех прогонов, чтобы из всего массива запусков периодически выбирался бы лучший вариант. Ведь если на какой-то специфичной версии алгоритма какая-то специфичная карта особенно удачно решилась, нет причин не отправлять это решение, даже если алгоритм потом менялся десять раз. Ну и сравнивать эффективность решений наглядно было бы полезно (мы потом похожую штуку сделали, но решения надо было вручную в репозиторий коммитить, такое себе).

Вторая безусловно полезная штука, которой нам не хватало — центр координации, который бы следил, какие задачи где считаются, и раздавал работу. Так можно было бы и решать быстрее (запустил на всех ноутах, и задачи считаются разные, не пересекаются), и гипотез разных потестировать, и на дашборд красиво вывести. Ведь известно заранее, что будет N задач, у каждой есть вход и выход, инфраструктура под это довольно универсальная получается.

Как правильно распределять силы я пока не понял. Я выложился по максимуму в первый день (до 6 утра, на следующий встал в 11) чтобы как можно больше впихнуть в Lightning Round (первые 24 часа). В результате весь второй день был как в тумане и работалось как на автопилоте. В третий зашли нормально, я переписал алгоритм даже, но тоже было очень тяжело. Возможно, здоровый сон каждый день (ну ок, кроме последнего) суммарно дал бы больше эффективности за три дня, чем такое.

Перерыв на обед
Перерыв на обед

В целом мне кажется, мы выступили неплохо для первого раза, но в целом неудовлетворительно. По ощущением наших сил едва хватило, чтобы выкатить самый простой жадный алгоритм с самым простым lookahead и мы даже не преступили к стадии, когда тестировали бы разные гипотезы и прочие умные идеи бы пробовали. То есть просто боролись со сложностью задачи.


С высоты
tonsky

Про Clojure и что я все сильнее про него ощущаю.

В каком-то смысле это продолжение моих размышлений, куда податься после Software Disenchantment, когда я понял, что надо что-то менять, но не понял, на что именно.

Да, Clojure это прекрасный, замечательный высокоуровневый/прикладной язык, лучший на свете. Прикладной в том смысле, что на нем хорошо писать программы, решающие конечную задачу – обслуживать, например, бизнес. Ну да, таких задач большинство. И ценности у них как раз вполне конкретные. Ясность коммуникации. Изоляция-локализация частей. Предсказуемость, надежность.

Во всем этом Clojure не просто блистает, она открывает следующий уровень. Иммутабельность снижает ошибки, функции хорошо композируются, мапы удобнее классов, и т.п. Да, Clojure позволяет двигаться безумно быстро. Скажем, загрузить файл, распарсить его, разложить аккуратно по нужным структуркам – это делается буквально за несколько строк. На таких скоростях не до абстракций — загрузчик, класс, конструктор, интерфейсы, методы... все это тупо не нужно, когда ты в одном инлайн выражении, даже имен никаких промежуточных не вводя, не то что классов, можешь столько работы проделать, сколько в Джаве обычно на целый maven-пакет размазывают.

Прикладные задачи нужно писать на настолько высокоуровневом языке, насколько позволяют требования по производительности. Ну вы все видели бум электрон-приложений. Если пишешь что-то типа сайта с тремя калеками-посетителями в день, или там мобильное приложение для листания фоточек, где все привыкли к latency и самое сложное что тебе предстоит это ну максимум побороть лайаут чтобы кнопки не распидарасило, то писать как-то по-другому, по-старому, было бы глупо. И это правильно, при прочих равных, писать надо на том, на чем писать приятно. А писать на Кложе приятно очень.

Но мир интереснее и разнообразнее, а писать такое все могут. Непонятно, как там выделяться, делать что-то значимое. Лучшее, что ты можешь на такой работе – взять что дают, максимально ясно все описать и максимально аккуратно все организовать. Такие себе цели. В смысле, достойные, но не так уж и сложно, каждый второй так может.

Хочется что-то более фундаментальное, что-то, чем будут пользоваться другие программисты, что-то, что хоть немного изменит ландшафт. Элементы инфраструктуры, базовые алгоритмы, структуры данных. Основы. И вот тут уже выбирать не приходится. Они должны быть настолько быстрыми, насколько это возможно. Оправданий делать наоборот быть не может. Никто не пойдет писать базу данных на JavaScript, потому что ей потом никто не будет пользоваться, с такой-то скоростью. Ну примерно как автомобили – если ты потребитель и купил машину, можешь ездить на ней как и когда хочешь, она может годами у тебя стоять без дела, можешь пользоваться ей неправильно, заправлять не тот бензин, всем пофиг. Но если ты делаешь эту машину, то будь добр выложись по полной – каждый узел, каждая деталь должны быть сделаны на пределах текущих возможностей и по качеству, и по производительности.

Никого не волнует, насколько инженеру хотелось бы и было бы удобнее печатать, скажет, фару на тридэ принтере из резины. Важен только результат. Большинство программистов вокруг нас пишут на прикладных языках высокого уровня – они просто ездят на машинах, они потребители. Но для того, чтобы они могли это делать, сами машины должны быть сделаны максимально хорошо.

И вот меня тянет как будто все больше в эту область. Инструментов, основ каких-то, значит. А трагедия в том, что моя любимая Clojure ну никак для этого не подходит, как бы мне этого ни хотелось. Чем дальше, тем больше понимаешь, что эта чудесная простота дается не бесплатно. Просто задачи были такие, что небесплатность была незаметна. Приглядишься бывает, с одной стороны hot loop из семи залуп, а с другой внутри вдруг вылазят какие-то промежуточные сиквенсы, какой-то там pointer chasing, primitive unboxing, вспыхивают на доли секунды замыкания просто чтобы что-то найти в трехэлементном массиве с помощью функции второго порядка, для того чтобы вернуть 2д точку выделяется на всякий случай целый Персистентный Вектор, для того что бы обновить пять полей в структуре у тебя создастся и тут же выбросится четыре промежуточных версии этой самой структуры, а вместо того чтобы посчитать что-то в цикле создастся целая ленивая последовательность, которая, фиг бы с ней, посчитается позже, просто сколько же оверхеда уйдет на то, что по сути могло быть простой итерацией с одной short переменной и оперировать вообще по константной памяти, еще и последовательно уложенной.

Вот кусок, написанный на идиоматичной Clojure:

(concat
 (mapv
    (fn [y] [from-x y])
    (range from-y (quot to-y 2)))
  (mapv
    (fn [y] [to-x y])
    (range (quot to-y 2) to-y)))

Тут тебе все: и ленивость (concat), и ФВП (mapv), и лямбды с замыканиями, и бесконечные ленивые последовательности (range). Вопросов нет, это действительно нормальные, часто используемые Clojure примитивы. Я даже не могу этот код назвать не-идиоматичным. Но. Просто представьте, сколько механизмов там крутится под капотом, чтобы вся эта красивая запись отработала. А ведь все что там по сути происходит это один очень простой цикл:

Point[] res = new Point[to_y - from_y];
for (int y = from_y; y < to_y; ++y)
  res[y - from_y] = Point(y < to-y / 2 ? from_x : to_x, y); 

Я не говорю что это лучше читается или еще что-то. Просто представьте, насколько более дружественен к компьютеру второй вариант. Насколько он прямее ложится на железо. Насколько он прозрачнее, ближе к сути. Неудобно, некрасиво, некомпозируемо, зато быстро. И честно. В каком-то смысле.

Когда мы говорим о разнице между условными C++/OCaml/Rust, Java и скажем Clojure (особенно средне-идеоматичной Clojure, с коллекциями там всякими), то эта разница может быть 1 к 2-3 к 100 например очень легко. Я помню, когда решал Project Euler и учил Clojure и OCaml, то Кложе-решения мне приходилось ждать какое-то ненулевое время (ну там задачи не шибко сложные, но все же). А OCaml успевал перекомпилять (!) программу, запустить, все обсчитать и выдать ответ за время, пока Java-машина с Clojure только стартовали.

Да, язык формирует образ мысли. Так или иначе, когда язык уже выбран, поиск решения – это вертеть в уме разные варианты имеющихся в нем кубиков, комбинировать, собирать решение из того, что язык предлагает. Можно мыслить на языке. Писать идиоматичный код. Но неплохо бы еще мыслить «на языке компьютера», т.е. представлять себе цену всех этих удобств. Выбирать неуклюжий reduce комбинации из ФВП и трединга. Вынести в record то, что лежало в мапе. Сделать loop, наконец. Иногда цикл это всего лишь цикл. И никак по-другому ты его не запишешь. И это нормально. Компьютер скажет спасибо.

Но это полдела. Если уж быть до конца честным, Clojure для perf-critical подходит из рук вон плохо. Даже Java подходит с очень большой натяжкой. То есть ее конечно можно разогнать, но зачем? Зачем героически бороться, чтобы в конечном итоге все равно, пусть немножко, но проиграть, потерять что-то? В итоге все упирается в то, что лучшее что я могу сейчас делать – учить Rust. А дальше-то что? Что на нем писать-то? Непонятно опять. Проблема.


Клавиатуры и дизайн
tonsky

Сразу предупреждаю: это будет странный, открытый пост без вывода и готового решения, а пишу я его только для того, чтобы как-то сдвинуть собственные размышления с мертвой точки.

Я типа into клавиатуры. Не совсем помешался, но что называется темой заинтересовался. Что меня зацепило так это что стандартный массовый «дефолтный» дизайн клавиатуры содержит ряд эргономических изъянов, которые очень легко логически объясняются и даже в принципе решаются. А я, как известно, люблю когда что-то не такое сложное, непонятное и необъяснимое как мона лиза, а наоборот простое, логичное и объяснимое: вот проблема, вот решение. Я огромное удовольствие получаю от проблем, у которых нашлось решение, в общем.

Так вот, об изъянах. Давайте их быстренько перечислим, чтобы вы могли ход рассуждений проследить. Пост как бы не о них, но они важная часть нарратива, кроме того, это самая практичная и интересная его часть, я полагаю.

Первое: смещенные ряды.

Вон артемий лебедев сначала две собственных клавиатуры сдизайнил, а спустя аж тринадцать (!) лет внезапно открыл целую формулу, на сколько долей у клавиатур кнопки смещены. Как будто это основополагающий принцип какой, смещение это. Нет, обычный исторический курьез, деталь, которая давным давно ни для чего не нужна, но по привычке осталась. Типа аппендецита.

Так вот, ряды смещены, потому что в печатных машинках  из-под каждой кнопки вверх шел здоровый металлический рычаг. Крепился он под центр кнопки, соответственно, физически одну кнопку ровно под другой разместить было нельзя. Вот и придумали сдвигать ряды. Тоже, кстати, красивое решение.

Четыря ряда — смещение на четверть. Вот и вся формула, блядь, как сказал бы Артемий.

Разумеется, в компьютерных клавиатурах никаких штырей никуда не идет, так что кнопки можно разместить как угодно, хоть на шарике.

Поэтому встает вопрос: а есть ли какое-то эргономическое преимущество у смещенного расположения? Оказывается нет, оно вредит даже. Пальцы вместо того чтобы предсказуемо ходить вверх-вниз по колонкам должны двигаться по странной траектории и находить кнопки в странных местах. Клавиатуры, лишенные этого недостатка, называются ортолинейными (ortholinear).

Вторая беда — угол расположения кнопок. К сожалению, руки у человека растут не из живота, как хотелось бы производителям клавиатур:

А из плеч. Поэтому для работы на традиционной клавиатуре их приходится неестественно изгибать:

У всех, кто так работает, в старости руки превращаются вот в это:

Если рассудок и жизнь дороги вам, не гуглите “Ulnar Deviation”
Если рассудок и жизнь дороги вам, не гуглите “Ulnar Deviation”

Так что вы там это, любители ноутбуков, поосторожнее. Идите там на улице погуляйте лучше, нечего на своем компуктере сидеть. В бадминтон поиграйте, не знаю.

Решается проблема довольно просто: делаем клавиатуру изогнутой. Вуаля:

И ваши руки теперь ну хотя бы не изгибаются в противоестественных местах.

Но тут кродеться проблема №3: люди-то оказывается разные. Я как человек ростом значительно выше среднего, остро это ощущаю, например. А у других людей вообще разная там ширина плеч, длина рук, глубина стола (глубина стола у меня как у человека довольно-таки средняя, надо признаться). Короче, угол входа рук в клавиатуру у всех разный. Поэтому если этот угол захардкодить, то он может просто не подойти. Как всегда случается, у некоторых производителей уже все формы отлиты, картинки на сайт поставлены, а человек такой взял и вырос больше, чем расчитывали! Проблема.

Что делать? Ну а что делать? Надо вынести угол в конфиг, конечно. Такие клавиатуры есть, называется эта фича «split», выглядит так примерно:

Меняй угол как хочешь, хоть параллельно на ширину плеч ставь. Ну и понятно что ничего лучше для роскошного проветривания подмышек прямо во время кодинга еще не приудмали.

Следующая проблема это цифровой блок. Короче, основное эргономическое наблюдение насчет работы с устройствами ввода такое: чем меньше надо двигать рукой, тем быстее и эффективнее ощущается работа (да и связкам полезнее, ну вроде — я ж не врач). Почему некоторые программисты яро не любят мышь? Да потому что за ней тянуться надо. А это далеко. Особенно если через цифровой блок.

Я вообще-то готов объявить цифровой блок в принципе бесполезным. Выкидываешь его и всем легчает. Мышь рядом, все счастливы.

И поверьте, в мелких движениях кистью даже лишних два сантиметра это разница между жизнью и смертью.

Ну а если цифровой блок прям нужен-нужен, ну поставьте вы его налево, где он и присутствовать будет, и мешать не станет. Microsoft, кстати, это осознала и сделала блок в Sculpt автономным. Клади куда хочешь (хотеть надо слева, а не там куда обычно — просто уточняю):

Правда в следующих ревизиях они его прибили гвоздями обратно. Наверное, люди слишком мало им пользовались, и кто-то решил что раз не хотят заставим. Но это шаг назад конечно.

Продолжая тему коротких пальчиков, которые не хотят далеко ходить. На клавиатуре есть так называемый home row — это дефолтное положение, где предполагается что будут лежать ваши пальцы, прежде чем что-то начать печатать, «стартовая» позиция. 

Ну как стартовая — она же и конечная, и промежуточная, как зона комфорта короче — выбежал, сделал че-то и скорей-скорей вернулся. Под эту позицию на кнопках F и J даже делают пупырышки, чтобы ты %username% мог с закрытыми глазами среди ночи найти этот самый home row. Скандалы интриги расследования. Не рассказывайте артемию.

Одна беда — home row в середине, а кнопки управления курсором далеко. А у программиста какое любимое занятие? Правильно, курсор туда-сюда гонять. Тут тоже решение довольно простое — управление курсором надо вынести на home row, с модификатором, тогда пальцы никуда далеко таскать не нужно будет. И вот тогда заживем! (п-с-с! Как это сделать написано тут).

Ну а раз курсор мы перенесли, можно еще место справа освободить, и мышь станет еще ближе, а клавиатура еще компактнее. Это все называется 60%. Типа, всего 60% клавиш от full-size клавиатуры, а так же удобно и ничем не уступает.

В жизни:

Можно пойти еще дальше и сказать, что пальцы штука короткая и двигаются они комфортно в лучшем случае на расстояние одной соседней кнопки от home row, дальше уже связки растягиваются, а там и сколиоз, и артрит, и геморрой с могилой. И если избавиться от четвертого и пятого рядок кнопок (цифры и F-кнопки), станет еще удобнее.

Так мы придем к идее 40% клавиатуры: у тебя есть несколько модификаторов, которые полностью меняют назначение кнопок. Таким образом какая-нибудь буква G это не только G, но и цифра 5, и процент, и какая-нибудь там открывающая скобка, в зависимости от нажатого сейчас модификатора. Пальцы далеко от home row не уходят, всё рядом, сплошные профиты.

Сколько модификаторов нужно? Вообще хватает двух, как ни странно. Вроде кажется, как же так, кнопок же дофига, не влезет же ничего! Но если раскидать, оказывается, что влезает очень даже комфортно. Да там еще и место свободное остается! (40% * 3 = 120% для математиков в треде)

Следующая все еще весьма разумная идея (да они все так или иначе разумные) это что большой палец у нас мышца здоровая, а нагружать его мы при печати особо не нагружаем.

Кстати, лирическое отступление. Никогда не задумывались, почему пробел делают таким длинным? Вроде бы символ как символ, печатается не чаще других букв, а некоторых может и пореже. Если знаете почему — расскажите.

Так вот, большой палец недонагружен. Он мог бы нажимать пять-шесть разных клавиш, а сейчас у него в лучшем случае пробел (причем дублируется на оба пальца, опять же — зачем?) и command. А чего на клавиатуре всегда не хватает, так это модификаторов. Точнее так — не хватает модификаторов, да и обычных кнопок тоже, которые было бы удобно нажимать. Мы уже выяснили, что все что вокруг home row на одну кнопку нажимать более-менее удобно.

А вот тянуться за всякими табами, энтерами, контролами и эскейпами очень не удобно. Да и мизинец существо довольно нежное, по-хорошему его бы разгрузить. Так что если есть возможность перенести часть неудобных кнопок туда, где они будут удобнее и комфортнее нажиматься, надо это обязательно делать!

Так мы приходим к раскладке называемой kinesis advantage, ну или ergodox: нагрузить большие пальцы по самое нехочу.

Есть, в принципе, и другие с похожими принципами. Просто на этом этапе мы так далеко ушли в область маргинального, что нельзя больше говорить о «трендах», «стандартах», «проверенных временем, устоявшихся решениях». Скорее разговор идет на уровне конкретных умельцев и их светлых идей.

Я пропустил про смещенные по вертикали ряды еще — ну тут довольно просто, пальцы у нас разной длины, и кнопки это учитывают.

Заметьте еще, что пришли мы к этому дизайну очень логичным путем, «благими намерениями». Мы фиксили то что сломано, новых проблем не добавляли, все изменения так или иначе были к лучшему.

Такие клавиатуры действительно лучше традиционных — ими действительно удобнее пользоваться. Иначе бы мы — клавиатурные энтузиасты, нерды, — этим бы не занимались. Даже на собственном опыте, вот моя клавиатура еще не до конца по фичам «дожата», не все улучшения включает в себя. Но даже на ней эффект заметен — посадка лучше, печатать приятнее и быстрее. Называется Let’s split, а точнее ее модификация Levinson.

— Но это же ужасно! Кто будет этим пользоваться? Как на этом печатать вообще?

Согласен, выглядит непривычно. Но давайте представим, что мы не решаем задачу «как изменить status quo» в текущем доминировании традиционных клавиатур. Вместо этого мы хотим предложить новый дизайн, который исправит все проблемы, до которых мы смогли дотянуться. И этот новый дизайн например настолько всех поразит своей логичностью и преимуществами, что люди, которые только знакомятся с компьютерами и им все равно нужно научиться печатать на чем-то в первый раз, эти люди будут сразу учиться на нашей клавиатуре.

Это мысленный эксперимент. Да, да, я знаю, такого никогда не случится. Но тем не менее. Представьте, короче что барьера на переобучение нет. Просто объективно — могла бы де-факто клавиатура быть такой, если бы ее сразу такой придумали? Было бы лучше?

И вот почему я спрашиваю. Ага, наконец-то переходим к выводам, которые, как я и обещал, разочаруют. Я проделал весь этот путь. Я глубоко согласен с каждым шагом, и по отдельности, и вместе. У меня нет порога на переобучение — я уже переобучился. На меня не действует сила привычки или давление мейнстрима — я глубоко презираю все мейнстримное и люблю выделять себя из толпы, демонстрируя свободу мышления. Я люблю интересные решения и out-of-the-box thinking, в конце концов.

Но что-то не клеится. Ну да, не клеится. Есть что-то еще. Недавно Рахим рассказал мне, что он тоже купил Microsoft Sculpt и пользуется теперь эргономичной клавиатурой. Но когда я был у него в гостях, оказалось что Sculpt отодвинут в сторону, а на столе лежит обычная Apple Wireless Keyboard. Не знаю, говорит, пробую разное, но все равно возвращаюсь к эпплу. Почему?

В принципе, я и сам долго облизывался на Ergodox EZ. Она как бы логически лучше, правильнее моей let’s split. Но потом думаешь, что как-то too much. Может ли вещь быть ну слишком уж эргономичной? Чересчур? Вот посмотрите на эти ножки:

−20 к сексуальности
−20 к сексуальности

Да, с их помощью ты еще более правильно расположишь кисти рук. Но как-то наоборот, отбивает немножко желаение, а не прибавляет, да? Типа как два свитера надеть — логически вроде теплее, но на люди почему-то выйти неудобно.

Или вот недавно мне показали Jian. Это вот такой красавец:

Логично? Да! Прекрасный проект. По многим параметрам, опять же, он лучше моего текущего положения. Раскладка умнее, кнопки правильнее и в правильных местах. Однако впечатление — на меня — производит что у человека с такой клавиатурой нет друзей. Слишком много ума, слишком мало чего-то еще. Чего?

Я сам не знаю :) Я же предупреждал, что пост разочарует.

Самое близкое, что может сойти за выводы, звучит наверное так. Получается что ты можешь быть дофига умным и прийти и порешать существующие проблемы. Это в общем-то не то чтобы просто, но допустим я до какой-то степени научился это делать.

Но оказывается этого мало! Мало решить максимальное количество проблем максимально логичным способом. Есть еще один этап — перерешать те же проблемы так, чтобы на результат было приятно смотреть. Нет, я не знаю что значит «приятно». Does it bring joy?

Конкретно с клавиатурами, может быть, чтобы эта самая «умность» не слишком фонила, не оттягивала на себя внимание, не перебивала собой настоящие утилитарные качества. Чтобы, в конце концов, вещь излучала простоту, а не сложность. Чтобы голова расслаблялась при ее виде, а не активизировала все мыслительные резервы.

И вот это уже сложно.


Тактика
tonsky

Добрый день, с вами Тонский и рубрика «внезапные озарения по гейм-дизайну, о которых никто не просил».

Да, я все продолжаю залипать на стримы по Героям и делать далекоидущие выводы. Вот что меня какое-то время удивляло: герои 3 и 5 вышли давно, сообщество с тех пор их оценило, погоняло в хвост и в гриву и понаписало патчей и «турнирных» правил, которые делают игру в целом более честной и терпимой. Причем меняется многое — и баланс, и интерфейс, и сетевой код, юниты и герои вводятся и запрещаются. Но что никогда не трогают так это ИИ. И это меня удивляло — почему?

Во-первых заметим, что герои игра исключительно одиночная. Даже в сетевом режиме ты полтора-два часа спокойно возишься у себя в песочнице, соревнуясь сам с собой в наиболее оптимальном разносе компьютерных стеков и обходе природных богатств, и в конце вы на одну короткую битву встречаетесь с оппонентом чтобы сравнить, кто лучше все это время играл против компьютера.

Это было во-первых. Во-вторых, тактический ИИ в героях, который как раз руководит этими нейтральными стеками, довольно тупой. То есть он прямолинейный, предсказуемый, не просчитывает вперед, не строит стратегии или даже плана на битву, совершает из-за этого совсем локально-как-бы-оптимальные-но-уже-на-следующем-ходу-кошмарные ходы. Если сравнить с шахматами, то это примерно уровень «на каждом ходу брать самую дорогую фигуру или двигаться к ней», все. Казалось бы, в чем интерес? Почему это не фиксят, сделать лучше такого даже стараться особо не надо. Значит оно так специально.

Ну и получается что да. Я еще один пример приведу, игра Into the Breach. Такая игра необычная, в которой ты не то что не пытаешься предсказать, как поступил бы «достаточно рациональный противник», в ней следующий ход противника прямо явно вываливается на тебя как часть ситуации. То есть на каждом ходу тебе просто показывают, что будет делать враг. А в чем тогда игра? Игра в том, чтобы обладая этой информацией, сыграть так, что бы у него ничего не вышло. Предотвратить этот самый предсказанный ход, по возможности, на 100%. То есть это такой пазл, в котором, во-первых, ситуация очень несимметричная и к противнику совсем нечестная, а во-вторых, вероятности отсутствуют как класс. Будущее просчитывается, RNG не мешает. И это вполне играбельно и очень даже интересно, зазасывает.

Ну и возвращаясь к героям, штука в том, что тактически Герои как раз такая же игра, хотя может она себя так и не осозновала. Главный шик — зная предсказуемую модель поведения противника, максимально абьюзить ее и получить с этого непропорциональное преимущество. Выманить врага из стен замка, где ему, стратегически, гораздо лучше. Заставить медленный юнит гонять по полю за быстрым, пока лучники его обстреливают. Подойти на столько, чтобы ударить первым. Подставить маленький отряд, чтобы потом безболезненно врубиться большим. Взять юнита ради права первого хода. Заманить на мины. Встать между камнями, чтобы кони не подошли. Обманом растратить ману. Это все вполне тактические задачи, искать решение которых (и находить) вполне себе особый вид удовольствия. Удачно подобранная конфигурация армии (иногда вплоть до плюс-минус одного юнита) кардинально меняет ситуацию и может разносить совсем неожиданные по размеру армии, если придумать как. Герои, как в них играют сейчас, и есть игра про это.

А если ИИ был бы умнее, битвы очень быстро перестали бы быть тактическими и скорее стали бы соревнованием у кого армия толще. Сильный нападает на слабого, слабый обходит сильных. Ну или классика геймдизайна, камень-ножницы-бумага, выбирай то что контрит врага, угадал — будешь в шоколаде, нет — извиняй, дорогой. Не то чтобы таких игр не бывает — бывает, конечно, и не то чтобы они неинтересны — очень даже интересны, но по-своему, по-другому. Если ты любишь тактику, то в стратегических героев ты бы уже не стал играть.

Ну и второй момент — для мультиплеера, конечно, важна симметричность условий для всех. Но герои — игра принципиально не мультиплеерная, и некий дисбаланс в битве умный ты—тупой компьютер, в общем-то, и составляет геймплей. Так что симметричность не очень-то и нужна, и даже с полной информацией о будущем игроку остается о чем подумать. Играть так может быть даже интереснее. Более того, если себе в этом признаться заранее, много новых возможностей для дизайна боев откроется.


Правильная русская клавиатура
усы2
tonsky

Привет! Сегодня мы займемся моим любимым делом — беспощадной критикой давно устоявшихся компромиссных решений.

Как известно, компьютеры придумали и производят в США, поэтому весь остальной мир находится как бы в положении ожидающего барской милости во всём, что касается интернационализации. Тут вам и ASCII байты по 7 бит, что позволяет впихнуть только латинские буквы, и языки программирования с побайтовыми функциями обрезания строк, что кромсает несчастные UTF-16 буквы всего остального мира ровно пополам, и все интерфейсы, в которых места хватает только под нелокализованные надписи, и добавляемая как бы с неохотой поддержка сложных падежей и склонений (ах, если бы во всех языках было достаточно добавить -s к любому числительному больше 1, я бы тоже не парился), и конечно клавиатуры, рассчитаные по количеству кнопок аккурат под латиницу. Даже европейцам с их одной-двумя дополнительными буквами по отношению к En-US приходится вертеться. Обратите внимание — ни в одной раскладке клавиатуры не предусмотрено физической кнопки под переключение языка! И не то чтобы места не хватало — на клавиатуре на самом деле целая куча хлама, который несложно выкинуть: и длинные кнопки, и резервные Shift/Command/Option справа, и идиотской длины пробел, и Caps Lock! Было бы желание. Но зачем американцам кнопка выбора языка? Правильно, вот пусть остальные как-нибудь выкручиваются. На советских компьютерах такую кнопку добавляли в первую очередь, кстати. Ну просто потому что Cmd+Space или Alt-Shift это даже не смешно.

Тут даже две кнопки, RUS и LAT, как доктор прописал

Ну ладно, пока корпорация Эльбрус не начала выпускать наши собственные Эльбуки с трехзначными битами, придется как-то самим. Давайте для начала глянем, что нам предлагает компания Эппл:

Кнопки, не меняющие свое поведение между слоями, скрыты

Это раскладка Russian - PC, больше напоминающая Windows и вообще в целом более адекватная. Простой Russian нет смысла даже обсуждать.

Итак, постановка задачи. В английском языке 26 букв. В русском 33. Надо где-то найти место под 7 дополнительных букв. Ни фига себе! — скажете вы, и будете правы. Придется потесниться.

В общем-то то что они сделали выглядит вполне сносно: цифры трогать не стоит, они одинаковые и там, и там, и нужны и там, и там. Часть пунктуации из английской раскладки выкинули, чтобы найти место под новые буквы. Пропавшую, но полезную пунктуацию (кавычки, вопрос, точка с запятой, двоеточие — без них нельзя, в русской они все-таки нужны) поставили на шифт-цифры вместо бесполезных более-менее чем полностью (в текстах, по крайней мере) собаки, доллара, крышечки и амперсанда. Буква Ё (да, её нет в Russian - PC, но она есть в виндовой раскладке, и вообще расположение крайне удачное) заменила довольно бесполезные опять же для обычных людей backtick и тильду. А те, кому они нужны (читай — программистам), один фиг пишут программы на английском.

Короче, по существу вопрос только один: нафига, ну нафига вы оставили бэкслеш? Для кого он, вообще, в принципе??? Тут надо пояснить: место на кнопках без шифта, или слой по умолчанию, самое ценное — такие кнопки можно нажимать одним пальцем, то есть проще всего. Поэтому туда выносят самые частотные символы. Скажем, строчных букв в текстах в разы больше прописных, поэтому первые на дефолтном слое, а вторые — на шифте. А теперь представьте: после всех надругательств, на которые пришлось пойти, чтобы впихнуть 33 буквы на место 26, у вас осталась одна свободная кнопка. И что вы делаете? Ставите на нее бэкслеш! Символ, который даже программисты-то нечасто используют, если уж честно. И это притом, что у вас непристроенными висят такие важные символы, как вопрос, кавычка, двоеточие, запятая, в конце концов. ЗАПЯТАЯ!!! Да что уж там, даже прямой слеш был бы лучше обратного. Его хотя бы можно представить в тексте. Но нет, поставили туда самый ненужный в мире символ. Окей, второй по ненужности, после бэктика.

Ладно, я пришел сюда чтобы не об этом поныть. Главная засада русской раскладки в том, что она дизайнилась в предположении, что английскую трогать нельзя. То есть английская останется как была, а в русской можно вещи двигать как нам удобно. В результате мы имеем вагончик пунктуации, которая в английской раскладке стоит на одном месте, а в русской — на другом. И это очень бесит, если вы хотя бы иногда переключаетесь между языками. Это трудно запомнить, это путается в голове, это совершенно какой-то хаос в обозначениях на кнопках:

вы уж простите за качество картинки

Обратите внимание на правый нижний угол, где точки и запятые написаны четырежды на разных кнопках. Если ты сидишь и набираешь текст и вдруг забыл где там точка и решил глянуть на клавиатуру — ну бог тебе в помощь. А особенно здесь шикарна кнопка слешей, конечно (возле Энтера).

Так вот, правильное (и единственно правильное) решение этой проблемы — английская и русская раскладки должны дизайниться вместе. То есть помимо условного Russian-Awesome должна быть еще English-Awesome compatible w/ Russian, которая НЕ совпадает со стандартной English (минус), но зато в паре с русской работает удобно и логично (огромный плюс). И при дизайне английской нужно учитывать, что вот в этих вот местах у нас будет впихивание, и как-то дизайнить вокруг этого.

Короче, должно быть так:

Обратите внимание, что русская раскладка не переопределяет никакой пунктуации, кроме диеза (который меняется на №, что настолько логично, что я это оставил даже). Часть символов в принципе нельзя набрать в русской раскладке (как и раньше), их место заняли буквы. Но это всё те же бесполезные для текста, а не кода, символы — амперсанд, пайп, бэкслеш, крышечка. Точка и запятая сохраняют свои позиции и в русской раскладке — большая победа! Обе набираются без шифта, как и должно быть. Двоеточие и точка с запятой остались на шифте, но переехали с цифр вниз — там они как-то поближе. Ну и логичнее (читай — проще запомнить) — точка с запятой над запятой, двоеточие над точкой. Осталось место под один дополнительный символ — левый верхний угол на шифте — и я поставил туда тильду, хотя в принципе он мог бы быть любым. Долларом, например — я не знаю, нужен ли в русских текстах больше доллар или тильда?

Внимательный читатель должен был заметить — а куда это у меня пропали Ъ и Ё? Все верно, они переехали на третий слой:

Это слой, который набирается с зажатым Option (или Shift-Option для заглавных). Ну да, это немножко читерство, но читерство ради благого дела — мы расчистили пространство на основных слоях под действительно нужные символы. А Ъ и Ё, ну они такие. Ё в принципе можно вообще не писать, она потихоньку отмирает, а твердый знак так и вообще супер малочастотная буква. Встали они на те же кнопки, что и Е и Ь, конечно, так что не запутаетесь. А само решение с Option вполне рабочее — ярлыков с Option+буква в системе нет, а сам macOS вводит через Option всякие эзотерические символы типа π, ¥, ©, ≈ и å. Ну и раскладка Бирмана работает через него же уже много лет безо всяких проблем. Короче, это вполне честный, но преступно недоутилизированный слой, которому я нашел очень неплохое применение.

Но самый кайф в том, что наконец-то можно подписать кнопки так, чтобы никто не сошел с ума:

зацените как я изящно ё и ъ обозначил

Да, все шифт-символы работают как в русской, так и в латинской раскладках.

Непривычно? Ну дык. Как человек, обучивший себя нескольким раскладкам, скажу: непривычно только первую неделю. Потом начинается кайф. Скажем, у меня уже очень давно в русской раскладке запятая на месте того бэкслеша. А так я старался по возможности латинскую не менять, иначе я бы еще восклицательный знак подвигал, больше-меньше поставил рядом и т.п.

Спорно? Ну а чего спорного-то? Сплошные факты :) Файл раскладки выложу на днях, если вы не наркоманы это использовать. Минус только один — то, что сейчас у вас нарисовано на кнопках, перестанет соответствовать тому, что они на самом деле означают. Но для любого, освоившего слепую печать, это совершенно не проблема. А в остальном сплошные плюсы.

UPD: Еще немного потюнил и выложил, читать тут https://tonsky.livejournal.com/318789.html


Не Vim-ом единым
усы2
tonsky

Появился повод высказаться по поводу Vim, а я давно собирался. Мнение такое, что он, крутой для своего времени, сегодня просто морально устарел.

Disclaimer: я просидел исключительно на Vim около года, активно программировал, так что это не рассуждения в вакууме. Я был в этой шкуре, знаю о чем речь на собственном опыте. Тем не менее, я без особых сожалений (и потерь, как я считаю) сменил Vim на более современные редакторы.

Итак.

Для начала давайте оспорим тезис, что набор текста — редкая операция. По моим оценкам, набор и трансформации делятся скорее как 50%/50%, т.е. набор далеко не редкая операция. Грубо, каждому переносу соответствует редактирование (т.к. код редко когда переносим без изменений), а каждому удалению — вставка (статистически, по GitHub, обычно графики вставок/удалений очень симметричные). Т.е. бегать между режимами приходится достаточно часто, чтобы записать необходимость их переключения в некую дополнительную ненулевую «нагрузку».

Далее, главное продающее свойство Vim это его «язык» трансформаций и манипуляций, настолько развесистый, что ему отдана основная клавиатура, а вводу текста — дополнительная, включаемая по кнопке.

Так вот, не хочу никого расстраивать, но система команд получилась такой не из-за какого-то великого инсайта, а просто потому, что у автора был тормозной модем и он «хотел печатать быстрее, чем обновлялся экран». Ну, представили ситуацию, да? Набрал «выделить текст, от кавычки до кавычки, заменить, ввести „абырвалг“, выйти», послал голубиной почтой и пошел пить кофе. Более того, даже в момент создания подход Vim не имел смысла для локального редактирования, где задержки нет. 

В современном мире у нас давно есть гораздо более продуктивные и удобные инструменты: визуальное выделение, непосредственное манипулирование и мгновенная обратная связь. Это значит, что ты видишь в реальном времени, что и где ты выделил и что сейчас произойдет. Кроме того, выделение можно подкрутить, опять же, в реальном времени. В примере из статьи, «выделить всё вплоть до кавычки», а потом подвигать курсор плюс/минус один-два символа в зависимости от нужды. В мире Vim выделить до кавычки и выделить до кавычки минус один символ — две разных задачи, в современном мире — одна, решающаяся одним инструментом — двиганием курсора. Не происходит операционного перегруза мозга и комбинаторного взрыва (какой инструмент выбрать для вот этого частного случая?).

Мгновенная обратная связь не менее важна. Увидеть синий прямоугольник выделения перед тем, как ввести операцию — очень важно для человека, сокращает количество ошибок, дает возможность их корректировки, повышает уверенность. В Vim тебе не остается ничего, кроме как надеяться, что та шестисимвольная комбинация команд, которую ты ввел, сделает ровно то, что ты хотел.

Еще раз. Vim намеренно не использует однозначно удобные и полезные методы визуальной коммуникации только потому, что их было нереально использовать через очень медленный модем на 300 бод. Это единственная причина. Количество причин, почему современные люди должны так же себя ограничивать — ноль. Такую цену имеет смысл платить, если альтернатива — потратить полминуты на непосредственное выделение текста (помните тормозной модем?), но это давно уже не проблема. Это же практически шахматы по переписке. Зачем себя мучать?

It was really hard to do because you've got to remember that I was trying to make it usable over a 300 baud modem. That's also the reason you have all these funny commands. It just barely worked to use a screen editor over a modem. It was just barely fast enough. A 1200 baud modem was an upgrade. 1200 baud now is pretty slow.

9600 baud is faster than you can read. 1200 baud is way slower. So the editor was optimized so that you could edit and feel productive when it was painting slower than you could think. Now that computers are so much faster than you can think, nobody understands this anymore.

The people doing Emacs were sitting in labs at MIT with what were essentially fibre-channel links to the host, in contemporary terms. They were working on a PDP-10, which was a huge machine by comparison, with infinitely fast screens.

So they could have funny commands with the screen shimmering and all that, and meanwhile, I'm sitting at home in sort of World War II surplus housing at Berkeley with a modem and a terminal that can just barely get the cursor off the bottom line.

It was a world that is now extinct. People don't know that vi was written for a world that doesn't exist anymore.

Но зато в Vim удобные «шорткаты» (команды, окей) и их много! Да, но в современных редакторах их не то чтобы сильно меньше. Даже стандартные системные (!) справляются с перемещением текста весьма неплохо (Cmd+←→ == начало/конец строки, Alt+←→ == прыгать по слову, Cmd+↑↓ начало/конец документа, Alt+↑↓ вверх/вниз на страницу). Окей, на Винде чуть похуже.

Плюс команды в Vim всё-таки немного более избыточны, чем хотелось бы. Проще жить, когда один инструмент решает две-три задачи (даже так: работает в двух-трех разных ситуациях), чем когда у тебя на каждый специальный случай отдельная кнопка. Вот например специальная команда для вставки в конец строки («a»), это что вообще? В обычных редакторах туда можно просто поставить курсор, а тут отдельная «команда». Или «r» (заменить одну букву и выйти), тогда как в обычном мире просто Backspace (кнопка «забой» :), которая и удаляет, и заменяет, если на месте удаленного набрать новую букву.

Ну и самая большая цена, которую вы платите сегодня, пожалуй, это то что подход Vim не совместим ни с чем вообще. Vim работает только в Vim, поэтому во всех остальных местах вы будете постоянно чертыхаться, пытаясь нажать «i», «Esc» и ходить по тексту через «hjkl». Везде: в браузере, в календаре, документах, эверноте, чатах, спотлайте, везде ваши так долго тренировавшиеся привычки идут лесом.

Здесь еще я мог бы пожаловаться на архаичность и несовместимость Vim с современным миром. У него, например, два буфера обмена ¯\_(ツ)_/¯ и оба внутренние. Ни один из них не попадет в ваш системный, т.е. скопировать текст внутри Vim и вставить его еще куда-то не получится. Он не умеет различать вставку текста и набор, поэтому если вы скопировали какой-то кусок кода (скажем, со StackOverflow) и вставляете, он его будет набирать посимвольно, что медленно, смешно и хреначит все отступы к чертям. Да, только из-за этого есть специальный режим «paste mode» и да, его-то как раз легко забыть включить/выключить. Часть этих «особенностей» пофикшена в графических клонах, скорее всего, но все равно, знакомство с ними было забавным и это тот случай, когда «через свежую покраску все равно проглядывали признаки старого, очень старого материала».

Ну и немного про достижения Vim. Хочу еще раз заметить, что Vim такой, какой есть, потому что так получилось. За ним не стояло какого-то гранд дизайна или проверенных научных моделей, система команд не то чтобы какая-то особенно логичная или удобная. Он ни подо что не оптимизировался, кроме модема и клавиатуры автора, у которой Esc был на месте Tab, а физических стрелок не было, зато уже были картинки стрелок на «hjkl»). Да-да, именно поэтому всем поголовно вимерам приходится маппить Esc на Caps Lock.

Зацените кнопку «рубля», кстати

Так вот. Первое великое (и случайное) достижение: стрелки на home row. Действительно, тянуть руку в правый нижний угол очень далеко, а перемещение по тексту очень частая операция. Процентов 50% успеха Vim я отдаю тому, что люди просто осознают всю идиотскость расположения стрелок в правом нижнем углу на клавиатурах, а Vim — наиболее доступный способ эту проблему хотя бы частично решить.

Но это откровение никак особо Vim не принадлежит и в идеале неплохо бы сделать его отчуждаемым. Стрелки не становятся вдруг удобнее, когда ты выходишь из Vim и переходишь, скажем, в браузер. Я решаю это маппингом Caps Lock + IJKL (да, не HJKL) на стрелки. Очень удобно и главное: работает везде.

Вторые 50% успеха я отдаю высокому порогу входа. Тут надо объяснить. В устройстве человека есть такой баг (ну или фича): люди не начинают лучше владеть инструментами/навыками/привычками со временем просто так, сами по себе. После того, как они научились делать задачу как-то (неважно, как, лишь бы получался результат), они будут продолжать делать её именно так. Если не прикладывать осознанных усилий, через год пользования Idea, например, ты будешь пользоваться ей так же, как через первую неделю. Горячие кнопки сами себя не разучат, удобные фичи не найдутся. Нужно тренировать себя, читать обучающие материалы, смотреть, как пользуются другие.

В примере с Idea ты вроде как более-менее понимаешь, как редактировать текст (так же, как и везде), поэтому естественного толчка к самосовершенствованию не происходит. Ты продолжаешь редактировать, как умел.

С Vim же ты вообще не понимаешь, что происходит. НИ ОДИН твой навык не работает. Тебе приходится разбираться. Ну и пока ты разбираешься, читаешь, ты успеваешь захватить значительно больший кусок области «редактирование текста», просто потому что никогда до этого специально её не изучал. Плюс постоянный цикл «блин, новая ситуация, в которой ни один разученный мной навык пока не работает» заставляет какое-то время гуглить, читать и смотреть, как другие люди просто редактируют текст

Спорим, для условного «Ворда» вы никогда бы даже не подумали гуглить такую табличку?

Опять же, это совершенно случайный фактор (высокий порог входа) и даже почти что контринтуитивный, но я считаю, что он как раз и сыграл значительную роль в успехе Vim. Ну а дальше, когда все частые ситуации разучены, начинается такое же плато, плюс включается Стокгольмский синдром :)

Ну вот как-то так. Наверное даже хорошо, что я написал этот текст сильно позже того, как распрощался с Vim (лет пять уже как, наверное), иначе он был бы полон эмоций. Сейчас же я просто смирился с фактом его существования и могу более спокойно посмотреть на его место в мире.


Летающий асфальтоукладчик
усы2
tonsky

Вот тут рассуждения про прокрутку и листалки

Вся книга — одна длинная прокручиваемой страница, но в ней всё в порядке и с дискретностью, и со стабильностью:

Книга разделена на смысловые развороты. Это помогает читать самодостаточными порциями. Нужный разворот легко узнать по внешнему виду в оглавлении. Листать развороты можно стрелками на клавиатуре. Иногда развороты содержат несколько сменяемых элементов — в этом случае при листании постепенно покажутся они все.

Меня во всей этой истории беспокоит вот что. Рассуждения все правильные, логичные. Ум с ними согласен. Но на уровне ощущений еще ни один сайт с хуком на onscroll мне удовольствия не приносил. Ни разу. Ни один.

Прокрутка содержимого внутри окна, вообще-то, не самая натуральная метафора. Точнее так: для нас важно, что у прокрутки есть ментальная модель. Человек представляет, что «имеется в виду», когда он крутит колесо и перед глазами проносятся цветные пиксели.

Вот это представление, что «что-то имеется в виду», очень важно. Нарисовать на экране можно что угодно. Но человеку проще, когда есть какие-то правила игры. Правила можно запомнить, привыкнуть к ним, предсказывать поведение. Если правила напоминают объекты реального мира, то интерфейс воспринимается легче — часть правил известны из повседневной жизни. Гугл на этом целую философию построил (см. Material design).

Ну и вот. У прокрутки есть правило, что это, мол, лист, и он внутри фиксированной рамки прокручивается. Айфон, например, перевернул направление скролла, но у них был резон, оно соответствовало идее того, что мы тащим за лист пальцем. Всё натурально, без натяжек и принуждения.

А теперь представьте, что приходит дизайнер, и вешает на скролл СПЕЦЭФФЕКТ. Друзья дизайнера, ну, наверное, скажут ВАУ. Обычные люди, наверное, смирятся: вот такой у нас теперь веб, что ж, надо терпеть.

↑ спецэффект на рэдимаге. Трудно объяснить, но, в общем, когда долистываешь до конца, под первым листом как бы оказывается второй

Меня же одолевают следующие эмоции:

  1. Беспомощность. Раньше контент слушался малейшего моего движения по тачпаду, теперь уже я не решаю, что и как будет двигаться. Теряется контроль. Некоторые сайты прям специально плавно замедляют скорость прокрутки, чтобы ты четко долистал до нужного блока и не проскочил, и это (искусственно замедленный скролл) ощущается почти как физическая боль. Из серии, хочу встать со стула, но руки-ноги не слушаются.

  2. Растерянность. Что-то происходит, но непонятно, что. Ментальная модель рушится (не выполняются ожидания), включается более дорогой и сложный процесс осмысления и поиска гипотез. И это мешает получить чистое ощущение, насладиться.

  3. Неуверенность. Я всегда пытаюсь понять, чего хотел дизайнер, и правильно ли я смотрю на его задумку? Листаю ли с нужной скоростью, не проскакиваю ли, можно ли крутить назад?

  4. Раздражение. Это всё еще и тормозит. Да, даже на моем macbook pro с дискретной видеокартой это почти никогда не 60fps. То есть чувствуется, как страница напрягается и выдает с заметным лагом что-то тормозное, о чем ты не просил. Ну какое тут удовольствие? Еще интересно, дизайнеры, которые это рисуют, они просто игнорируют этот факт или как? То есть предполагается, что тормоза надо терпеть? Что когда-нибудь компьютеры станут мощнее? Дизайн с прицелом на будущее, так сказать?

  5. Расстройство от непродуманности. Модель с прокруткой хорошо понятна и изучена. Когда прокрутку перехватывают и показывают какие-то сценки, анимации, эффекты, это всё не рассчитано на нелинейное потребление. Нельзя попрыгать по странице, вернуться в какой-то кусок вверх, листать назад. Лучше бы вставили видеоролик, там тоже анимашки, но хотя бы все эти вопросы продуманы.

В добавок ко всему, это еще и бесполезно. Никто не заставляет перехватывать прокрутку. Любой контент можно оформить без спецэффектов. Любой! Это чистое украшательство. В кавычках. Огромных, иронических кавычках. Меня, на самом деле, ужас берет, когда представлю, что вот так у Бюро Горбунова целая книга сверстана. Это не дает какой-то особенной пользы, кроме того, что хотелось сделать не как у всех.

Представьте, что вы едете на велосипеде, с более-менее постоянной скоростью и усилием. И вот на перекрестке велосипед неожиданно вместе с вами поднимают в воздух и начинают показывать видеоролик. Что делать? Крутить дальше? Остановиться и смотреть? Покрутить назад? Будет ли эффект? Зависит ли от меня хоть что-то? Как я мог это предвидеть? И т.п. И даже если разобраться в ситуации, как ей управлять, остается еще один вопрос: хочу ли я на таких условиях вообще управлять?

Короче. Прокрутка это свобода. Я уже писал, как важно, чтобы хоть что-то в компьютере работало надежно и предсказуемо. Это совсем другое качество взаимодействия. Да, компьютеры делают люди, люди ошибаются. Но если хоть что-то можно сделать надежно — прокрутку, или там, чтобы ссылки цвет меняли при наведении, или чтобы табы быстро открывались — мы начинаем этому верить. Не отбирайте это у нас! Алло, дизайнеры


Помедленнее, я записываю
усы2
tonsky

Ну что, я нашел еще одну метрику, чтобы меряться и унижать других.

Вот это — ultimate статья про latency редакторов. Подробно разбираются все задержки и весь overhead между нажатием клавиши пальцем и появлением символа на экране. Как вы догадываетесь, IDE и редакторы выступают сильно по-разному.

Мои измерения (MacBook Pro 2,3 GHz i7, Mid 2012):

Меряются именно задержки в редакторе, нажатия кнопок генерятся программно. Если я правильно понял, то v-sync, double buffering и compositing в эту цифру включены, а вот буфер/лаг в мониторе и задержки внутри клавиатуры/USB надо еще добавить. И это все на пустых файлах без синтаксиса, т.е. в реальности там еще доложится.

Да, теперь факт что «IDEA тормозит» научно доказан! Zero-latency typing улучшает ситуацию, но не так кардинально, как их намеряли в статье (может, из-за ОС?)

Мой рабочий редактор Light Table выступил одним из худших. Плюс я еще пишу на 30Hz мониторе (+16 ms avg задержки) и wireless клавиатуре (хз). Ну и в OS X v-sync и double buffering особо не выключишь (впрочем, в Windows 8 наверняка тоже). Пока думаю, что делать.

Может ли человек это заметить? Ощущал ли я тормоза до того, как прочитал статью и сам себя убедил, что они есть? Определенно да. Например, я абсолютно интуитивно слез с iTerm на Terminal, потому что в нем печатать приятнее. Маленькая задержка создает в мозгу ощущение «эти буквы я буквально произвожу», а большая — как вести диалог, перекрикиваясь с человеком в другом конце пещеры (с моей стороны сигнал ушел, посмотрим что он там сделает). О задержке как таковой не думаешь, но общее ощущение, что тяжеловато.

Обратите внимание, что Vim в голом виде практически ничего не добавляет к оверхэду редактора. Но стоит добавить банальнейшие status bar или, еще хуже, powerline, как все катится к чертям:

Внезапно отлично выступил GNU Emacs для десктопа. В терминале уже помедленнее, а Aquamacs вообще недоразумение:

Ну и внезапно шутки про «программировать в блокноте» уже не такие уж и шутки. Посмотрите, как выступил Text Edit:

Тулза для измерения


Проблема с ярлыками
усы2
tonsky

Чем отличаются эти две иконки?

Если у вас есть какой-никакой опыт с компьютерами, вопрос покажется вам слишком простым. Однако, есть проблема.

Ярлык — абстрактное понятие. Его можно понять, но для этого требуется усилие и определенный склад ума. Ярлык противоречит бытовому опыту. В жизни, если у вас есть книга, то она либо стоит на полке («все книги»), либо лежит на столе («десктоп»), либо мы ее сейчас читаем («открыта сейчас»). Можно сказать, что у книги есть состояние, ее можно переводить из одного в другое, но — на что можно всегда положиться — книга одна и она всегда в каком-то одном месте.

Так вот, ярлык ломает эту простую концепцию «есть вещь и есть ее место», вместо этого вводя понятие «ссылки на объект», которому в реальном мире ничего не соответствует. Программисты, например, специально этому обучаются, да еще и не у всех получается (см. тест «понимаешь ли ты указатели?»). То, что такой абстрактный концепт просочился в интерфейс — плохо для компьютеров как бытовых устройств (глупо спорить, что компьютеры и телефоны в большинстве своем давно уже что-то вроде очень сложной и неудобной кофеварки).

Положение усугубляется тем, что ярлык нарочно выглядит так же, как и исходный объект, но работает по-другому.

Т.е. есть сильная визуальная метафора (иконка), и есть некий тонкий скрытый нюанс, который кардинально меняет ее поведение. Из-за этого диссонанса (выглядит одинаково, работает по-разному) надо держать в уме дополнительную переменную — тип объекта. Если про него забыть, а это очень легко, сразу появляется ненадежность: может работать так, а может иначе, как именно — не предугадаешь.

Ненадежность в интерфейсе — страшная беда. Она рождает страх, неуверенность, осложняет формирование привычки и сильно поднимает порог обучения. Обучиться надежному действию (нажми кнопку — потечет вода) на порядки проще, чем ненадежному (сначала нажми сюда, чтобы войти в режим настройки, затем сюда, чтобы выбрать дату, затем сюда чтобы скорректировать день). Хуже всего это в интерфейсах, которыми пользуются нечасто — у мозга просто недостаточно усилий, чтобы запомнить все контексты и переходы. Даже если потратить время и «разобраться», через неделю все выветрится.

Что делать? Делать интерфейс надежным (вещи всегда ведут себя одинаково и предсказуемо). Качество интерфейса, в котором хотя бы часть элементов работает всегда одинаково (всегда-всегда, без контекстов, условий, попапов и прочих «но») вырастает на порядки (см. мой пост Единственная надежная кнопка).

Дальше: не вводить абстарктных концепций. Ориентироваться на бытовой опыт. Проще всего с иконками: если у тебя приложение есть, есть и его иконка. Ярлыков нет, иконка одна и где-то в одном месте лежит: в панели быстрого запуска, на десктопе, в папке Хлам. Это очень простая и прямолинейная концепция: иконка=приложение, папки/панели/экраны=место.

Так работает, например, iOS, который перепридумывали с нуля, выбросив наследие десктопных компьютеров:

У каждой иконки может быть только одно место. «Вид» удаления только один, и он совсем удаляет:

А вот Android сохранил ярлыки и создал путаницу:

Даже в свежайшей 6-й версии они путают пользователя тем же вопросом, что и Windows 95: удалять ярлык или приложение? Такие вопросы можно задавать только бородатым 40-летним сисадминам.

Тут же возникла и печальная рассогласованность: чтобы убрать приложение с десктопа в нижнюю кнопку, надо перетащить его наверх.

Формально, как программист, я понимаю ход мысли, но это очень, очень сложно и нелогично на бытовом уровне. У меня на столе лежит книга и я хочу убрать ее на полку. Зачем перетаскивать ее в мусорное ведро, да еще и в другом конце комнаты?

Но прогресс не стоял бы на месте, если бы в Гугле не придумали как сделать хуже чем было в Windows в 95-м году. Ярлык сейчас от приложения визуально не отличается совершенно:

Т.е. две абсолютно одинаково выглядящих вещи работают по-разному. Идите, объясните своей маме, когда на что нажимать.

Полноты ради, у Windows Phone та же проблема, но с десктопа нельзя приложение совсем удалить, только ярлык. Плюс в том, что хотя бы не нужно принимать решение (Удалить или Удалить?). Это значит, что человек сможет пользоваться своим телефоном без услуги «звонок другу», но все-таки приложения будут копиться. Это все-таки лучше, т.к. прямо сейчас жить можно, а проблему можно решить позже — очень правильное качество «скромных» интерфейсов.

В обсуждении просьба помнить, что это пост о конкретном интерфейсном аспекте, а не о том, что «Андроид говно» (конечно говно, даже windows phone лучше). Просто единственный нормальный пример, где нет этой проблемы — iOS, в остальных местах она везде есть (особенно на десктопах). Также, не надо мне пожалуйста рассказывать что я тупой и не разобрался. Или что вы лично разобрались и не видите проблемы. Это искаженное восприятие и отсутствие эмпатии. Некоторые вещи должны (и могут) быть сделаны так, чтобы не надо было разбираться.

Единственная надежная кнопка
усы2
tonsky
Одна из причин, почему смартфон — прибор для гораздо более широкой аудитории, чем традиционный ПК — надежно работающие кнопки. Что бы ни происходило, в каком бы состоянии ни находились телефон, приложение, соединение с интернетом, блютусом и USB, в одно нажатие вы всегда можете выключить телефон, и вы всегда можете «вернуться на базу» — некое хорошо знакомое стартовое состояние, домашний экран. Ключевые слова «надежно» и «в любой момент». Что бы ни происходило, как бы плохо ни было написано приложение, в какую бы непридвиденную комбинацию внешних условий оно ни попало, телефон гарантирует вам работу двух этих кнопок.

В то же время на ПК даже самая надежная кнопка, даже в идеальных тепличных условиях, нет-нет да и выдаст что-то неожиданное. Иногда запускает приложение, а иногда (как известно, в самый неподходящий момент) показывает окно с обновлениями, подсказками, скажет, что потеряло каталог, не хватает прав или еще что-то. Иногда закрывает приложение, а иногда просит сохранить файлы, согласиться с потерей табов, ответить, надо ли перезапускать при старте. _Внутри_ компьютера нет ни одной надежно работающей кнопки. Единственно надежно работающая кнопка на компьютере — это Reset. Возможно, именно сквозная ненадежность всего и вся разработала у людей страх компьютеров.

Естественно, если спросить ПК-программиста, то ничего странного в этой ситуации нет, для него это более чем нормально. Подозреваю, эта культура идет от старых представлений об искусственном интеллекте, диалоге человека и машины как равных. Предполагается, что человек спокойно сидит, сосредоточен только на диалоге и полностостью вложил все свои ресурсы на извлечение из беседы результата. Это очень удобно, потому что спокойно можно свалить на человека часть работы, а ошибки и сложности списать на его недостаточную тренированность или вовлеченность (пресловутое «юзеры тупые!»). Мы, как программисты, глубоко впитали эту модель взаимодействия, и, на мой взгляд, недостаточно часто пытаемся ее отрефлексировать.

Однако на пути превращения ПК в предмет быта, такой же, как кухонный нож, спички, телевизор, эту модель пришлось и еще много раз придется пересмотреть. Предмет быта это по определению что-то, вокруг чего не вращается жизнь, что-то, что используется в редкие моменты, строго для решения сиюминутных задач. И в этой ситуации как раз нужна надежность. Нельзя вырывать человека из его текущего контекста и создавать ему новый контекст диалога с компьютером, с какими-то компьютерными желаниями, требованиями и жаждой общения. Включение должно включать компьютер. Выключение — выключать. Приложение — прилагать. И никаких соплей.

Главное — не слушать программиста. Программист с огромной страстью и убедительностью докажет вам, зачем диалог сохранения, почему просить обновиться, как давать контроль над файлами, кто запретил выключать питание во время обновлений и почему нельзя просто так взять и выдернуть флешку, в конце концов.

И тем не менее, пришли смартфоны, и внезапно оказалось, что программисты вполне могут решить все эти проблемы сами: приложение гарантировано закрывается, ничего никогда не спрашивает, все всегда сохраняет и открывает _само_, да еще и само обновляет нужные себе ресурсы, включая код. Оказалось, дело было не в тупых пользователях, а в ленивых программистах. Дальше будет больше.

Мораль очень простая: всегда ставьте человека на первое место, а компьютер на второе, третье, четвертое. Человек нажал «Выход» — надо выходить, как бы ни хотелось с ним именно в данный момент поговорить.

P.S. в комменты пришел тот самый «ленивый программист» и оправдывает проблемы UI тем что работа программиста тяжелая

Git vs. Git CLI
усы2
tonsky
Я могу объяснить все концепции git с нуля примерно за 15 минут, словами плюс порисовать. Сам git для этого не нужен.

Попробуйте, проделайте этот мысленный путь со мной: вот вы ничего не знали, и вот вам рассказали про DAG ревизий и как им можно вертеть (как угодно). Вы теперь знаете про ревизии и что они вяжутся друг с другом. Вам больше ничего не нужно, вы поняли как будете это использовать и как организовть процесс — это вытекает естественно.

Тут-то и наступает неудобный момент: вам уже хочется узнать, как это все представлено в компьютере. Выясняется, что, во-первых, моих понятных картинок не будет, а будет, гм, консоль, и во-вторых, нужно говорить набором совершенно незапоминаемых команд и опций — в основном потому, что термины из cli никак не отражают термины исходной концепции.



Вопрос на засыпку: «Что делают эти команды?»:
git reset --mixed
git checkout --cached
На базовое освоение cli уходит две недели, и это связано не со сложностью git как такового, а с абсолютной немнемоничностью их набора букв. Естественная реакция на такое — прострация, ты понимаешь, что нужно сделать, но нужно еще запомнить заклинания на древнеэльфийском.

Понятно, как так получилось. Git CLI затачивался под сценарии использования, а не под низлежащую концепцию. Была идея, что человек будет работать по одному накатанному пути, и для этого надо завести специальные команды с названиями, стыренными из SVN для привычности. Потом захотелось сделать на пути опциональные ответвления, для них заплатным способом добавляли новые команды или флаги в старые. О цельности и атомарности всего комплекса никто не думал.

Концепция git гибкая, универсальная и перпендикулярная, а workflow команды составные и многошаговые и поэтому плохо комбинируются. Набор элементарных действий всегда проще понять и заставить работать, чем пойти наперекор кем-то за тебя придуманной лыжне. Если захотел чего-то нового, придется ждать, когда протопчут новую лыжню, потому что поехать по сугробам, оказывается, не на чем.

Как сделать правильно. Нужно однообразное жонглирование диффами — отцепить от одного места, прицепить к другому, повторить, слить, разделить. Плюс команду, двигающую указатель ветки в нужное место.

Всё, это весь git, простой, наглядный, удобный и комбинируемый. Управляется одной командой трех аргументов, «скопируй вот это отсюда сюда». Не нужно никакой ереси вроде специального пакета чтобы поддерживать git flow который нужно отдельно изучать.

Это именно то, о чем говорил Линус в этом интервью:
Eventually you’ll discover the Easter egg in Git: all meaningful operations can be expressed in terms of the rebase command. Once you figure that out it all makes sense.
Я как немножко с делами разгребусь, напишу как это будет выглядеть. Это тизер пока такой.

без темы
усы2
tonsky
Сделал картридж для деплоя веб-приложений на OpenShift не в виде war-файла, а в виде полноценного clojure приложения.

Зачем это нужно?

Первая причина — использовать несовместимые с сервлетами веб-сервера, реализующие websocket, long polling — то, что наиболее интересно современному хипстеру.

Вторая причина — более легковесное, нативное clojure-приложение (можно nrepl воткнуть, к примеру), и более прямолинейный цикл локальной разработки.

Ну и третья причина, или почему OpenShift? — до трех халявных приложений по 512 Мб RAM и 1 Gb диска.

https://github.com/tonsky/openshift-clojure

Никто не умеет писать программы
усы2
tonsky
Я тут папе ноутбук прикупил с Виндоус 8. Одним из артефактов знакомства стала новость, что при первом включении надо проходить капчу:



Ну и естественно, более плотно пообщался с родителями на тему компьютеров.

Каждый раз, когда они меня о чем-нибудь спрашивали (простые вещи вроде «а как мне позвонить Сереге / а вот и он звонит и чо»), я, прежде чем ответить, слушал про себя, как мой ответ звучит. Звучит он всегда как бред сумасшедшего. Нелогичные аргументы, несостоятельные причины и абсурдные следствия. И сразу становится таааак неудобно перед хорошими людьми, которые ни в чем не виноваты, и я не виноват, а просто мы компьютерщики капитально зафейлили такой классный бытовой прибор с таким классным потенциалом.

Я сам-то всё понимаю. Но это я молодым разобрался и у меня эта ментальная модель компьютера в голове сидит. Когда тебе 15 лет, ты не выносишь суждений, а запоминаешь как обстоят дела. С моделью хорошо, модель помогает, конечно. Когда что-то случается, ты ориентируешься в происходящем не по тексту сообщения (который не спешит на помощь — Ошибка 34, ну?), а по внешнему виду окошка — способу рендеринга, форме, цвету, расстоянию между кнопками. Я не говорю, что это плохой навык лично для меня, но со стороны звучит абсурдно, не так ли? И не очень понятно, чем так провинились люди, которые просят научить их пользоваться компьютером, а мне для этого надо вот это вот невербализуемое, несводимое к алгоритмам или правилам, передать.

Пока о ментальной модели не нужно чего-то сказать, не видно, насколько она мимо — мимо людей, их представлений о жизни, мимо устройства мира, мимо всего их предыдущего опыта, мимо потребностей, задач. Хочешь посмотреть фотографии — тебя спрашивают, какой программой вы хотите их открыть? (о, это издевательское «хотите»! Я не хочу программу, я хочу фотки посмотреть!) Идешь открывать документ — тебя просят подключиться к интернету и завести аккаунт майкрософт. Вздумал перекинуть файлы — только не выдергивай флешку! Пройди в область уведомлений, это такие маленькие значки рядом с часами, найди такую иконку в форме черт-знает-чего… О, как я люблю диктовать подобные вещи по телефону! Знаете, как соединить два компьютера в сеть? Самый простой способ — дождаться приезда сына из Ульяновска.

В разговорах о компьютерах я все чаще соглашаюсь, что всё это бред. А как сделать вот это? Так-то и так-то. Но это же бред! Да, бред. Такие вот делают компьютеры. Я даже не могу сказать зачем. Просто не умеют. Извините. Почему у айтишников, да и вообще у нердов прокачана формальная логика? Потому что обычные житейские навыки внутри компьютера не действуют. Как злющий юрист, компьютер всегда норовит подловить на тончайших, едва заметных глазу нюансах и различиях. Только делает это не по злому умыслу, а по общей своей дубовости.

Я вообще боюсь смотреть, как люди пользуются компьютером. Боюсь, что мне станет неудобно, но больше всего боюсь, потому что не смогу помочь. Я даже к жене в ноутбук стараюсь не заглядывать. Если я увижу ошибку и начну объяснять, тут же станет неочевидно, чей способ правильнее, потому что в правильном способе зачастую меньше логики и он сложнее. Скриншот экрана, сделанный фотоаппаратом, внутри ворда внутри рара? Это не смешно. Это правда проще.

Мы все халтурим. Халтурим со страшной силой. Никто не умеет, не научился и не хочет учиться писать программы. Уже 20 лет потребительский компьютер ходит вокруг удобства использования, не приближаясь к нему. Аппаратный прогресс впечатляющ. Для компьютера больше не нужна отдельная комната, он может затеряться в папке бумаг. Но стоит загореться экрану, и на нем начинают крутиться всё те же перфокарты.


без темы
tonsky
Устанавливаете родителям https://secure.logmein.com/products/free/.

Из любого браузера (или даже айПада — но это не очень удобно) заходите и чините все что угодно не отрывая свой браузер от стула. Единственная проблема — позвонить попросить включить компьютер.

Весь комплект почему-то бесплатен.

Профит.

Семь смертных грехов программных систем, которых в 2011-м году стыдно не замечать
tonsky
У современных программ, без сомнения, много проблем, но я выбрал вот эти с учетом веяний моды и того, что постепенно уже осознает мейнстрим. Так сказать, на самом острие софтостроения.

Семь грехов:
  1. Медлительность
  2. Блокирующее взаимодействие
  3. Неуместные ограничения
  4. Ненастроенность
  5. Несамостоятельность
  6. Забывчивость
  7. Гордыня

1. Медлительность

  • Вы просите Эклисп установить мейвен-плагин и он выполняет вашу просьбу в течение получаса.
  • Вы запускаете Фотошоп и успеваете прочитать пару записей в блоге.
Программы должны работать быстро. Сейчас уже понятно, насколько скорость — это фича. Пользователи уходят даже с медленных веб-страниц. А когда программа занимается ерудой на ровном месте — это гарантированное расставание на всю жизнь. И самое главное — интерфейс всегда, что бы ни случилось, должен отзываться на действия пользователя. Иначе программа признается мертвой.

2. Блокирующее взаимодействие

  • Вы нажимаете в svn кнопку «коммит», и пока он не уйдет целиком и полностью, вас никто никуда не отпустит.
  • Вы применяете к изображению сложный фильтр и должны дождаться, пока он полностью обсчитается, прежде чем сможете на что-нибудь нажать.
В общем случае пока программа что-то делает (даже по пустякам), она заставляет вас ждать «на всякий случай», мало ли что вы там испортите. Апофеозом этого греха являются модальные окна — программа ничего не делает, но никуда уйти не дает. Рецепт простой — работать в фоне, вот применять сложнее.

Положительный пример: Final Cut Pro X, к десятой версии обзаведшийся фоновым рендерингом материалов. Видели бы вы овацию на презентации этой фичи.

3. Неуместные ограничения

  • Описание не может быть длиннее 1000 символов.
  • Название категории не может содержать пробелов.
  • Вы должны вступить в блог, чтобы прочитать запись из него (хабрахабр).
В общем случае один человек ткнул пальцем в небо и родил ограничения. Еще и называет это «подумал о вариантах использования». Лучшие ограничения — это те, которых нет. Мы же не байтики на дискетах экономим в 21-м веке. Пора уже привыкнуть, что вместо «vasya_poopkin» я могу логиниться по гораздо более красивому «Василий Пупкин». Если ты можешь сделать, скажем, описание продукту любой длины (а он может) — делай, не надо гадать, что скорее всего никому больше 1000 не понадобится. Никогда не угадаешь.

4. Ненастроенность

  • Первым делом в текстовом редакторе вы меняете шрифт и включаете автосохранение.
  • Первым делом в браузере вы убираете ненужные панели и включаете сохранение паролей.
В общем случае программа в изначальной конфигурации неудобна/неприятна/непригодна для использования. Люди привыкли, что в первую очередь нужно залезть в настройки. Но это не значит, что это хорошо. В магазинах не продают лопат, которые сперва нужно перековать. Вы не меняете ручку у молотка сразу после покупки. Программа — такой же инструмент, и обязанность продавца (читай разработчика) сделать так, чтобы ей можно было сразу пользоваться. Кстати, если об этом подумать, то 50..90% настроек можно будет выкинуть за ненадобностью.

Положительный пример: iA Writer, текстовый редактор без панели настроек.

5. Несамостоятельность

  • Не могу создать проект, папка уже существует (пустая).
  • Вашему репозиторию нужна компактификация. Запустите её!
  • Не могу запустить поиск, содержимое файловой системы изменилось, нажмите «обновить».
  • Среди ваших ста тысяч пятисот файлов обнаружился один защищенный, я пока остановлюсь, что мне делать???
В общем случае программа не делает чего-то простого и ждет от пользователя очевидной команды. Хуже, если задача частая, или если это происходит во время длительного процесса, когда человека нет рядом. Пользователь, конечно, ко всему привыкнет, но немного интеллекта и решительности программам бы не помешали. Обычно у программ полно свободного времени между взаимодействиями с пользователем, и хорошо бы в это время делать что-то полезное (индексировать/обновлять/проверять/подкачивать), что ускорит последующее взаимодействие.

Положительный пример: браузер Сафари сам распаковывает архивы и монтирует образы сразу после загрузки. Гугл Хром сам скачивает и устанавливает обновления без единого окошка.

6. Забывчивость

  • Вы не указали адрес, пожалуйста, заполните эту форму заново.
  • Сохранить документ? — Нет. — Ок, удалил. — Хотя подожди...
  • Вы говорите файндеру показывать файлы списком, а он в следующий раз опять показывает их превьюшками.
  • Вы выбираете один слой, но через какое-то время объекты опять создаются на другом.
  • Вы настраиваете размер окна, а при следующем запуске программа его забывает.
В общем случае я не должен предпринимать никаких дополнительных действий, чтобы то, что я ввожу (в любом виде — информацию, настройки, конфигурацию окон, яркость экрана), сохранилось. Господам программистам надо поднять жопу со стула и пойти и сделать, чтобы так и было. Это поведение по умолчанию, блин!

Положительный пример: ИнДизайн ЦС5 даже после падения поднимается ровно в том месте, где вы закончили, независимо от того, сохранялись вы или нет.

7. Гордыня

  • Обновление прошло успешно! (Аваст, голосом!)
  • Я еще не запустилась, но вот тебе мой сплешскрин поперек всего и крадущий фокус.
  • Здравствуй, дорогой друг! Я знаю, ты запустил меня, чтобы что-то сделать, но у меня тут обновление, пойди лучше скачай его.
  • А я маленькая программка управления фотоаппаратом, и я боюсь что ты меня никогда не увидишь, поэтому вот тебе мой тулбар в браузер, иконка в трей, автозапуск со сплешскрином, стартовая страница и поиск по умолчанию.
  • Вы не чистили свой рабочий стол 60 дней...
В общем случае программа считает себя центром вселенной и о любом событии беспокоит пользователя, чтобы он ей почесал за ушком, скачал обновление, даже информирует его о том, что все идет хорошо (!). Программы мигают в панели задач, прыгают в доке, суют свои иконки (я смотрю на тебя, adobe reader), чего-то постоянно от тебя требуют (нагло, не правда ли?). В результате, если ты не загружался в систему полгода, то тебе преградит путь десяток каких-то тупых окон, а тебе всего-то нужно было файл забрать, например. Все-таки, компьютер для человека или человек для компьютера? Иногда мне кажется, что мой ответ отличается от мнения большинства разработчиков.

Бонус.

Семь примеров феерической тупости из коллекции автора.
  1. Медлительность. Вы просите Виндоус зайти на самбу и ждете сначала полчаса чтобы она спросила у вас пароль, потом еще полчаса она будет «пытаться присоединиться» к соседнему компьютеру. Ощущения как будто пограничник забрал у вас паспорт и тайно пошел на обед.
  2. Блокирующее взаимодействие. Модальные целиком для браузера alert/http basic auth form — такие, что нельзя переключиться в другую вкладку, чтобы скопировать пароль.
  3. Неуместные ограничения. Что делать, если данное мне при рождении имя не удовлетворит критериям этого безымянного аналитика?
  4. Ненастроенность. Все сайты погоды, которые даже не пытаются определить по айпи город.
  5. Несамостоятельность. Введите номер телефона без пробелов и специальных символов.
  6. Забывчивость. Сохранить документ, который вы писали 7 часов? Да-нет? Упс.
  7. Гордыня. Виндоус Виста: установлено обновление, вы здесь? Ок, 10 минут никого нет, прибиваю всё и перезагружаюсь. — Эй, чувак, а что, электричество отключали?

Если кому-то показались хоть немного интересными высказанные здесь мысли, то рекомендую продолжить чтение здесь:
  • Дональд Норман. Дизайн промышленных товаров / The Design of Everyday Things. Про то, что вообще за проблемы с вещами, кто в ней виноват и кто должен ее решать.
  • Джеф Раскин. Интерфейс (выложен полный текст). Про то, как уже вполне могли бы работать компьютеры, если бы в Майкрософте тоже слушали умных людей. Знакомым с этой книгой забавно смотреть, как идеи и принципы из нее потихоньку протаскиваются в современный мир Эпплом, а затем и всеми остальными.
  • Алан Купер. Об интерфейсе / About Face 3. Очень большой и очень обстоятельный труд, по косточкам разбирающий современные интерфейсы и предлагающий адекватные решения многих проблем. Например, половина релиза OS X Lion как минимум была здесь предсказана :)


без темы
tonsky
Посмотрел тут — не помню, по чьей наводке, оно у меня полгода лежало — „Hammock-driven development“ от Rich Hickey, автора языка Clojure. По-русски это как „Разработка из гамака“.

Выступление (кстати, кто знает, как переводится rant? Я давно гадаю) началось с логичной мысли: Humans get good at what they practice. → Practice problems solving.

Дальше пошло про то, как правильно кормить свой мозг и получать от него результаты, и про то, что для размышлений компьютер из всех раздражителей отвлекает сильнее всего, а думать лучше в гамаке с закрытыми глазами. Чтобы не расслаблялись, он всех пристыдил вопросом про „когда вы последний раз думали над проблемой целый день? А месяц? А год?“

Еще хорошая цитата: When the facts change, I change my mind. What do you do, sir? — John Maynrad Keynes.

Клевое, короче, видео. Самое клевое, что оно общечеловеческое такое, не айтишное. После этого слушать доклады про то, как в библиотеке А завернуть хреновину Б, скучно, мягко говоря. А вот в какое время дня как мозг использовать — на всю оставшуюся жизнь пригодится.

Ну и в который раз подмечаю, что у интересных людей и вещи выходят как минимум интересные, а у неинтересных Скала какая-нибудь (интересные не „ой, что это?“, а так, что глядя на них научиться чему-то небанальному можно). Удивительно здесь то, насколько определяющи именно качества личности, в программировании-то!

Кстати, половину того же самого я написал еще в 2006 году, в возрасте 21 года. Вот ведь как бывает.

без темы
tonsky
Оказывается, системный блок-то у нас процессором называют. В мебельных «подставка под процессор». Даже в эфире «России 24» в ролике про порно-хакера http://www.vesti.ru/doc.html?id=342240

Раненых лошадей пристреливают, не правда ли?
tonsky
Eclipse начал виснуть. Тупит на одном-единственном шаблоне. Возможно, что тупит Freemarker-plugin, убивая все удовольствие от работы. Редактирую этот конкретный файл обычным текстовым редактором. Но не в этом дело.

Больше всего раздражает время его работы. На количестве проектов >50 штук (да, мы сами виноваты, и даже (кажется) собираемся это исправить, но пока не) количество действий на старте Eclipse просто зашкаливает. Примерно минут 5-7 сидишь и глядишь на его еле ворочащееся окошко. Чтобы запуститься, ему обязательно нужно сделать много-много разных действий: просканировать директории проектов, обновить зависимости maven-а, обновить информацию svn, скомпилять workspace, наверняка, что-то еще, что я не успеваю заметить. Потом — внимание! — разработчику нужно ручками открыть java-перспективу, чтобы инициализировались средства работы с java, потом! нужно тыкнуть в плагин JBoss packages, чтобы он его тоже инициализировался (тварь), после чего он зависнет буквально намертво на минуту-две, ну и после этого всего даже можно работать. Если через 5 минут после начала работы он наглухо подвиснет или вылетит, и надо будет запускать его заново — ну, вы можете представить себе чувства разработчика.

Когда eclipse виснет, я это очень люблю. Дело в том, что для java-приложений считается нормальным повиснуть на полсекунды-секунду, чтобы собрать мусор. Так и Eclipse, как уважающее себя java-приложение, регулярно подвисает на несколько секунд. Бонус в том, что иногда он зависает на полминуты (это все корявые плагины, конечно, виноваты, но тем не менее), и привыкнув к этому, не замечаешь, когда он зависает насовсем. Ты смотришь на его неподвижное окно минуту, две, три, скромно лелея мысль, что вот еще несколько секунд — и он воспрянет ото сна, и ты сможешь хотя бы сохранить свои несохраненные данные, но фиг. Эта ситуация еще ни разу не разрешилась в пользу разработчика.

Стоит также помнить, что не у всех наших разработчиков компьютеры достаточно мощные для того, чтобы это вытерпеть. К сожалению, память объемом 768 Мб — не редкость в компании. За такими компьютерами на билд уходит по 10 минут, на каждый редеплой — одна-две минуты, а чтобы запустить eclipse с утра, от получаса до бесконечности (плохие слова вырезаны) (см., например, http://totally-absurd.livejournal.com/338166.html и http://localstorm.livejournal.com/103731.html).

Но и на более современных двухядерных компьютерах работать не слишком комфортно. Каждый редеплой в jboss занимает полминуты в релизе и полторы в дебаге, что, к сожалению, поощряет нас использовать дебаг как можно реже и только в крайних случаях. Это при том, что раньше я считал debug самым эффективным средством отладки на свете.

Не без огрехов работает и svn-plugin. Практически после каждого update-а ломается workspace с дивной рекомендацией «очистить проект» (так и пишет: что-то у меня не складывается, мол, cleaning and building all projects is recommended), после чего перекомпиляция займет до пяти минут. Однако будет честно заметить, что эта проблема, кажется, есть только у меня, по крайней мере никто на это больше не жаловался.

Небольшое отступление. В общую копилку маразмов eclipse стоит отнести невыясненный плагин (я так и не выловил мерзавца), который находил сгенеренный maven-ом вполне корректный application. xml и время от времени заменял в нем названия jar-ок на слово «classes». Проблема, кажется, проявлялась только у меня, и решил я ее тем, что спрятал файл application. xml в другое место.



Что делать? Видимо, выкину maven plugin for eclipse, научусь засасывать в workspace только необходимы проекты, придумаю что-нибудь с JBoss packages (поменяю на WTP или научу делать замену файлов без вызова redeploy), попытаюсь таки выкинуть Mylyn, которым все равно никто не пользуется, попытаюсь, опять же, выкинуть тяжеловесный WTP, если получится, ну и заодно перееду на новенький 3.4.1. От svn-plugin-а, к сожалению, никуда не деться, а то я бы и его выкинул. Одновременно поглядываю в сторону IDEA. Да поможет нам бог!

без темы
tonsky
О пользовании головойЧитать дальше...Свернуть )

мертвый сезон
tonsky
элджи-друзья словно вымерли -- 2 дня как никто не пишет
мне тоже писать особо не о чем

с покупкой компьютера спать стало абсолютно некогда. И если раньше я ложился в 12, а вставал в 9-10, то сейчас не раньше 3-х, а то и 4-х ночи. А вставть приходится порой и в 9.30. Интересно, долго я так смогу?

Теперь у меня есть новая игрушка -- она называется SuSE Linux Professional 9.1. Она требует внимания и заботы. Нужно настраивать её и украшать всякими прибамбасами. На 2 последних дня сайт kde-look.org стал моим домом. Иногда приходится ей помогать, переустанавливать дрова для видеокарты. Да, это куда любопытнее винды. Но время, время? Нужно учиться, а не страдать фигнёй. А для этого нужно желание. Буду медитировать до тех пор, пока оно не появится.

-----------------------

Задача: В темной комнате лежат 13 монет. Известно, что 5 из них лежат решкой кверху, а 8 -- орлом. Нужно разделить на 2 кучки, чтобы в каждой число монет, лежащих решкой, было одинаковым.