Сліпий друк для програмістів: символи, цифри і швидкість, що має значення

Сліпий друк для програмістів — це здебільшого про клавіші, які звичайний курс друку пропускає: цифри, дужки, оператори й комбінації з Shift навколо них. Програміст, який друкує звичайний текст зі швидкістю 90 WPM, може повільно набирати код, а той, хто друкує текст на 50 WPM, — швидко. Ми помітили це, коли під час тестування вставляли власні файли з кодом у власний режим. Швидкість падала на третину або більше порівняно з режимом слів, теплова карта клавіш світилася на ряді цифр і правому мізинці, а найповільніші ривки припадали на токени з дужками.

Чому WPM на звичайному тексті погано відображає набір коду

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

Перша — склад символів. Ми порахували. У перших десяти нотатках цього блогу приблизно 93 зі 100 непробільних символів — літери, 5 — розділові знаки і 2 — цифри. У JavaScript-коді консольного інструмента npm частка літер падає приблизно до 80, а символів зростає до 19. Модулі json і email мови Python дають від 80 до 85 літер, а один наш щільний скрипт збирання — 64, і третина його символів — це спецсимволи. Тож у коді спецсимволів приблизно в три–сім разів більше, ніж у нашому тексті. Більшість із них розташовані у верхньому ряду або потребують Shift, а це означає правий мізинець і слабші дотягування. Наші тести з англійськими словами складено з 1 000 найпоширеніших слів корпусу субтитрів; «{» серед них немає.

Друга — ритм. Текст друкують довгими відрізками. Код набирають короткими ривками між паузами на роздуми, прокручування й читання. Добровольці з дослідження 136 мільйонів натискань Дхакала та колег 2018 року, які копіювали речення, мали в середньому близько 239 мс між клавішами. День програміста сповнений перерв на кілька секунд, і швидкість ривка всередині коротких відрізків важить більше, ніж будь-яке середнє.

Третя — редактор. Автодоповнення, сніпети й гарячі клавіші означають, що програміст на роботі друкує лише частку символів, які бачить на екрані. Жоден тест друку не може цього виміряти, і наш не вдає, що може.

Чи важлива швидкість друку для програмування?

Менше, ніж люди думають, і в іншому місці. Коли хтось питає, чи вистачить 60 WPM, щоб бути програмістом, відповідь — так, із застереженням: якщо ти дивишся вниз, шукаючи символи й цифри, код ти набираєш не на 60 WPM. Уміння надрукувати рядок, не втрачаючи нитки думки, важить більше, ніж сира швидкість, а погляд на клавіатуру — саме те, що цю нитку обриває.

Як друкувати символи швидше і чому цього ніхто не вчить

Питання, яке раз у раз з'являється на форумах про друк: людина друкує літери наосліп із пристойною швидкістю, але щойно починає писати код, знову шукає очима символи, цифри й навіть великі літери, і хоче поступово їх вивчити так само, як вивчала літери, — по кілька клавіш за раз.

Символи складні почасти через Shift. У коді npm, який ми рахували, приблизно 45% натискань спецсимволів припадало на символи з Shift, як-от ( ) { } : і $, — близько 9 на кожні 100 непробільних символів, ще навіть до великих літер. Тож спершу виправ звичку з Shift: тисни Shift рукою, яка не друкує сам символ. ( і ) стоять на клавішах 9 і 0 правої руки, тож для них потрібен лівий Shift; ! @ # $ — під лівою рукою, тож для них — правий Shift. Більшість самоучок для всього тримає лівий Shift, а для ! це змушує лівий мізинець натискати дві клавіші одночасно. Перевір свою звичку: надрукуй рядок з @ і $ і подивися, який мізинець рухається.

Символи важко відпрацьовувати окремо, і нудно відпрацьовувати взагалі: літери приходять разом зі словами, дужки — разом із кодом, а випадковий код нецікавий. Наша відповідь — відпрацьовувати символи на справжніх рядках коду, по одному класу за раз.

По одному класу за раз

Ось порядок, який ми б обрали, і порядок треку символів, який ми будуємо для сторінки тренування. Поки його не випущено, можна робити те саме, вставляючи справжній код у власний режим, по одному класу символів за раз, і не додавати наступний клас, доки поточний не вийде на точність 95%:

  • Цифри. Ряд цифр, до якого тягнуться пальці з основного ряду. Це перший клас, бо це найуживаніший клас не-літер і бо майже в кожного тут є погана звичка, наприклад вказівний палець натискає 4, 5, 6 і 7. Тест із цифрами — швидка перевірка.
  • Дужки парами. Спершу ( ), потім [ ], потім { }. Парами, бо одну без іншої ти майже ніколи не друкуєш: у тому коді npm ( трапляється 6 195 разів, а ) — 6 194. Саме тренування руху «відкрити-закрити» як однієї одиниці робить його швидким. На закривній дужці в більшості людей і ламається ритм.
  • Оператори. = + - * / і кутові дужки, а також складені форми (==, =>, +=, !=). Вони розкидані по ряду цифр і клавішах розділових знаків правої руки, а кілька потребують Shift на тій самій руці, і це незручна частина.
  • Лапки й розділові знаки. ' " ; : , . — більшу частину роботи виконує правий мізинець. Крапка з комою і двокрапка — це те, в чому найбільше відрізняються ті, хто пише мовами сімейства C, і ті, хто пише на Python, тож тренуйся на рядках мовою, якою користуєшся.
  • Оболонка й рідкісні символи. Вертикальна риска, зворотна скісна риска, тильда, зворотний апостроф, циркумфлекс, амперсанд, решітка, долар, «равлик» і клавіша _. _ і зворотний апостроф дивують більшість людей; код у snake_case постійно використовує _, і більшість друкарів натискає її не тим пальцем.

Кожен клас у більшості людей забирає тиждень-два десятихвилинних занять, тож увесь трек — два–три місяці. Це повільніше, ніж вивчати літери, бо клавіші символів розташовані далі, а звички, які ти замінюєш, старші.

Що йде не так, судячи зі статистики по клавішах: люди вивчають символ із правильним пальцем, а потім під тиском повертаються до старого, бо старий рух ще кілька тижнів швидший. Статистика показує це як клавішу, інтервал якої дико скаче: швидко, коли тягнешся правильно, і повільно, коли ні. Ліки — затриматися на цьому класі ще на тиждень.

Пари дужок і автозакриття

Редактори автоматично закривають дужки, і це породжує слушне питання: навіщо вчитися друкувати закривну?

Дві причини. Автозакриття непослідовне: в одних місцях воно спрацьовує, в інших ні, наприклад у терміналі чи у вікні чату. Друкар, який на нього покладається, щоразу вагається, щоб перевірити, чи воно спрацювало, і це вагання коштує більше, ніж натискання. А друк поверх автоматично закритої дужки (натискання «)», коли редактор уже її вставив) — це теж натискання, тож закривну дужку ти друкуєш у будь-якому разі.

Коли ти вставляєш код у власний режим тут, текст розбивається за пробілами, тож відступи зникають, а кожен токен стає словом. Це водночас і обмеження, і зручність: тобі не треба друкувати чотири пробіли на початку кожного рядка Python, але ти їх і не тренуєш. Повноцінний режим коду, який обробляє відступи й автоматично закриті пари так, як це робить редактор, є в наших планах, і це складніше, ніж здається.

Швидкість коду проти швидкості тексту

У нас замало результатів у режимі коду, щоб публікувати перцентилі, і ми радше зачекаємо, ніж вигадуватимемо їх. У наших власних заїздах швидкість на реалістичному фрагменті коду була десь від половини до двох третин швидкості тієї самої людини на звичайному тексті, і це співвідношення покращується більше від тренування символів, ніж від загального тренування.

Цифра, яка таки переноситься, — точність. Програміст, який друкує текст із точністю 97%, а код — із 90%, має проблему із символами, і теплова карта клавіш показує, з якими саме. Програмістові з 97% на обох просто треба більше набирати коду. Наша методика підрахунку пояснює, як точність враховує виправлені помилки.

Як стандартний орієнтир, із наших звичайних режимів найближчий до коду — тест із розділовими знаками з увімкненими цифрами. Фігурних дужок у ньому не буде, але він залучає Shift і ряд цифр, а для більшості людей саме в них і проблема.

Вибір клавіатури, який допомагає

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

Розкладка важить більше, ніж перемикач. Dvorak переносить дужки вгору, у ряд цифр, і переміщує більшість розділових знаків. Colemak і Workman залишають дужки там, де вони на QWERTY, але обидві переносять крапку з комою на місце, де на QWERTY стоїть P, і програмісти, що пишуть мовами сімейства C, це відчують. Детальніше — у нотатці про розкладки.

Шар символів кращий за більшу клавіатуру. Багато розділених і компактних клавіатур дають змогу поставити дужки й оператори під пальці основного ряду на шарі, який вмикається клавішею під великим пальцем. Із усіх апаратних змін, про які розповідають програмісти, цю ми спробували б першою, бо вона означає, що тобі більше ніколи не доведеться дивитися вниз у пошуках символу.

ISO проти ANSI. На ISO-клавіатурах (британських і більшості європейських) додаткова клавіша біля лівого Shift і висока клавіша Enter змінюють місце зворотної скісної риски та вертикальної риски. Якщо ти тренуєшся на одній, а працюєш на іншій, мізинець промахуватиметься. Саме тому наша емуляція має обидва варіанти Colemak-DH.

Перемикачі на швидкість майже не впливають. Лінійні, тактильні й клікові перемикачі відрізняються відчуттям і звуком, а журнал натискань не знає, які ти натискав. Наша нотатка про механічні клавіатури розбирає цифри.

Деяким людям із зворотним зв'язком допомагає звук: звук помилки каже, що символ неправильний, і не треба дивитися вниз. Увімкни його, поки вчиш символи.

Десятихвилинне заняття програміста

Ось що ми робили б щодня протягом двох-трьох місяців, які займає трек символів:

  • Дві хвилини: 30-секундний тест зі словами як розминка, точність 97%.
  • Шість хвилин: поточний клас символів на власному тексті, вставленому з твого коду. Зупиняйся за першої ознаки повернення до старого пальця.
  • Дві хвилини: один фрагмент коду мовою, якою ти користуєшся найчастіше. Після нього дивись на теплову карту клавіш, а не на WPM.

У дні, коли десяти хвилин немає, друкуй закривну дужку сам. Це найменша звичка в цій нотатці і зазвичай перша, що окуповується.

Часті запитання

Яка швидкість друку добра для програміста?

Будь-яка приблизно від 40 WPM придатна для роботи, якщо ти друкуєш символи й цифри наосліп. Вище за це вузьким місцем стають мислення, читання і вміння працювати з редактором, а не швидкість пальців.

Як навчитися друкувати цифри наосліп?

Тренуй ряд цифр окремо, доки точність не триматиметься на 95%, натискаючи кожну цифру тим пальцем, що лежить під нею на основному ряду, а потім додавай цифри до звичайного тексту.

Джерела