Клавиатуры и программирование

Не так давно я сменил свой рабочий инструмент. Выбор был очень непростой, долгое время я откладывал этот вопрос, говоря себе, что пока и на “дефолтной” нормально работается. И чтобы вы понимали масштаб раздумий, я пристально приглядывался к ErgoDox EZ. А потом купил обычную такую mxKeys от старого доброго Logitech. О чем ни капли не жалею и буквально каждый день получаю удовольствие от работы с ней. И теперь хочу поделится с вами кое-какими мыслями, которые возникли у меня в процессе выбора и эксплуатации данного девайса, а также некоторыми мыслями о клавиатурах и наборе текста в общем. Так что готовьтесь, сейчас я буду убеждать вас, почему клавиатура вроде mxKeys — отличный выбор для программиста и почему вам не нужен эргономический монстр.

Истоки боли

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

Освоили? Поздравляю, теперь вы будете страдать так же, как и я. Уа-ха-ха.

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

Я предполагаю, что многие начинают с мышки. По крайней мере я начинал так. Я очень хорошо помню период в детстве, когда я игрался с Visual Basic. Излюбленным хватом у меня тогда был геймерский: левая рука на клавиатуре, правая — на мышке. И я постоянно кликал в текст, чтобы перенести курсор или выделить текст. Иногда я убирал руку с мыши, чтобы набрать что-то большое.

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

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

Но потом и этой эффективности становится мало и хочется пойти еще дальше! Хочется вообще не убирать руки с текстового блока, не тянуться постоянно к этим чертовым стрелочкам. И тогда перед нами встает три пути:

  • Легендарные программерские редакторы
  • Переназначение клавиш на уровне системы
  • Клавиатура с нестандартной раскладкой, позволяющая нажимать стрелочки, не убирая руки с основного ряда

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

Текстовый редактор 80 уровня

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

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

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

Впрочем, с волшебством в emacs все же стоит быть осторожным. Я прекрасно помню постоянно ноющее левое запястье во времена работы в emacs, чего у меня не наблюдалось ни в один другой период жизни. А все из-за того, что львиная доля команд в emacs требует зажатия клавиши Control. Которую в десятипальцевом методе мы нажимаем мизинцем. И когда я говорю “команд”, я имею в виду не какой-нибудь extract method (хотя такое в emacs тоже можно наладить), а банально подвинуть курсор на 1 символ вперед. Зато не снимая руки с основного ряда! Говорят, это лечится, хотя бы отчасти, переносом Control на Caps Lock. Но я лично этого не делал, по той же причине, почему не хотел переносить стрелочки на уровне системы.

Но проблема emacs’а в применении к программированию в другом. Это классный редактор для текста, но не для кода. Сколько плагинов на него не наверни, он не сможет понимать ваш Java или C#1 так же хорошо, как полномасштабная IDE. Он не может провести extract method да так, чтобы после этого сказать “чувак, а если вот эту штуку вынести как параметр, то можно еще 3 куска кода заменить” — а это именно то, чего я и хочу, черт возьми, заменить все эти четыре куска кода! И я, конечно, могу это сделать баснословно быстро на уровне текста, скопировал, вставил, заменил, тут подредачил, тут подправил, быщ-быщ-быщ… а на IDE я уже сделал это 2 секунды назад в 2 нажатия, и теперь думаю над следующим изменением. В какой-то момент я просто понял, что в IDE я продуктивнее тупо за счет того, что она работает с кодом на более высоком уровне понимания2.

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

Так что я ушел из emacs и желанием возвращаться не горю.

Десятипальцевый метод

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

Собственно, изначальная идея десятипальцевого метода очень проста: использовать 10 пальцев эффективнее, чем, скажем, 2. Ускорение происходит за счет того, что пока вы нажимаете клавишу одним пальцем, следующий уже движется к цели и будет готов ее нажать как только, так сразу. Ну и, само собой, так мы сокращаем расстояние, которое пальцам необходимо преодолевать чтобы добраться до следующей кнопки. Тут работает банальная геометрия, как ни крути, чем меньше расстояние — тем быстрее мы доберемся до цели.

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

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

Давайте посмотрим на какую-нибудь строчку из тех, что программистам приходится набирать3:

for (int i = 0; i < targets.size(); ++i) {

Итак, давайте посмотрим, как она набирается десятипальцевым методом. Начало просто шикарное: for набирается указательным и безымянным пальцами, тут есть чередование рук, все получается быстро и четко. Но потом идет скобка, для которой нужен шифт, потом равно, которому нужен шифт, потом меньше, которому нужен шифт, снова скобки… Кроме того, все эти символы лежат на периферии. Мы не используем наши ловкие средний и указательный пальцы, вместо этого мы постоянно дергаем шифт левым мизинцем и пытаемся попасть по нужному “знаку препинания” правыми безымянным и мизинцем.

Вы скажете, в настоящем коде имена длиннее и куда больше похожи на текст? Согласен. Но часто ли вы набираете их целиком? Или все же пользуетесь автодополнением? Я иногда специально пишу имена вручную, соВсемиЭтимиВерблюжимиРегистрами, просто для практики, но я признаю, что так выходит дольше и трудозатратней, чем автодополнение, поэтому обычно все же пользуюсь им. Тем более, что для излюбленного программистами camelCase нужно постоянно давить шифт. Мизинцем. Ох.

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

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

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

Про клавиатуры

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

Дело в том, она требует десятипальцевого метода. А я не хочу его использовать 100% времени. Десятипальцевый набор — это просто инструмент, который некоторые задачи решает хорошо, а некоторые — не очень. Стандартная 101-кнопочная раскладка4 — это универсальная вещь, которая подходит для любой задачи. Любой пользователь ПК знаком с ней. Когда к вам подсядет коллега, чтобы поотлаживаться или попрограммировать вместе, он сможет нормально пользоваться вашим компьютером, если вы используете стандартную клавиатуру и стандартную раскладку в редакторе. Мне страшно представить что испытает геймдизайнер, когда я позову его опробовать какую-нибудь фичу, а там ErgoDox EZ. Эээ, а где тут контрол?

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

Вообще, мне кажется, что это распространенная проблема среди многих вещей, которые у кодеров считаются крутыми: консоль, emacs и vim, split-клавиатуры. Эти вещи хотят, нет, требуют, чтобы я 100% времени работал эффективно. Но я этого не хочу, потому что это не эффективно! Это не эффективное использование ни моего времени, ни моих мыслительных ресурсов. Я не хочу использовать сочетание клавиш для команды, которую вызываю раз в месяц. Я не хочу судорожно припоминать название файла или идентификатора, я хочу, чтобы инструмент снял с меня эту нагрузку, чтобы он показал контекст и я смог выбрать из готовых вариантов. Я хочу, чтобы я мог нажать меню Refactoring и увидеть, какие есть варианты. А когда окажется, что чем-то из этого я пользуюсь часто, то смог бы запомнить шоткат, написанный прямо в меню, а не где-то в недрах руководства пользователя, про навигацию по которому есть отдельное руководство (это не шутка, если что).

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

Высокопрофильные клавиатуры не нужны

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

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

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

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

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

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

Примечания

  1. Хотел было добавить в список C++, да понял, что ни разу не видел IDE, которая его понимает.
  2. Конечно, для этого вам действительно нужно освоить все эти возможности, типа сложных рефакторингов. И, поверьте мне, оно того стоит.
  3. Да, большинству из нас в наши дни редко доводится набирать именно такую строчку. Я просто привел ее как весьма показательный и удобный пример.
  4. 101 кнопка — это перебор. Если бы была возможность, я бы взял клавиатуру без цифрового блока, чтобы держать мышку ближе. Но с ними проблема: почему-то производители считают, что клавиатура без цифрового блока непременно является портативной и ее срочно нужно подключать к планшету, телефону, чайнику…
  5. Если вы, конечно, попадаете по кнопкам, ха-ха.

Leave a Reply