程序员的盲打:符号、数字和真正重要的速度

程序员的盲打,主要是练普通打字课程跳过的那些键:数字、括号、运算符,以及围绕它们的 Shift 组合。一个打英文文章能到 90 WPM 的程序员,敲代码可能很慢;而一个打文章只有 50 WPM 的人,敲代码可能很快。我们在测试时把自己的源代码文件粘贴进自定义模式,就注意到了这一点:与单词模式相比,速度下降了三分之一甚至更多,按键热力图在数字行和右手小指一带亮成一片,最慢的爆发速度出现在带括号的词元上。

为什么文章 WPM 不能很好地代表敲代码的速度

代码和普通文本在三个方面不同,而一个由常用英语单词组成的打字测试,这三个方面一个也测不到。

第一是字符构成。我们统计过。在本博客的前十篇文章中,每 100 个非空格字符里大约 93 个是字母,5 个是标点,2 个是数字。而在 npm 命令行工具的 JavaScript 源码中,字母降到约 80 个,符号升到 19 个。Python 的 json 和 email 模块是 80 到 85 个字母,我们自己的一个密集的构建脚本只有 64 个,三分之一的字符都是符号。所以代码中的符号大约是我们文章的三到七倍。其中大多数在数字行上,或者需要按 Shift,也就是要用到右手小指和那些较弱的伸指动作。我们的英语单词测试取自一个字幕语料库中最常用的 1,000 个单词,“{”可不在其中。

第二是节奏。文章是一长串连续打下去的;代码则是在思考、滚动和阅读的间隙里一小段一小段地打。在 Dhakal 等人 2018 年那项分析了 1.36 亿次按键的研究中,志愿者抄写句子时平均每两次按键间隔约 239 毫秒。程序员的一天里充满了好几秒的停顿,短段落里的爆发速度比任何平均值都重要。

第三是编辑器。自动补全、代码片段和键盘快捷键意味着,一个在职程序员实际敲出的只是屏幕上字符的一小部分。没有哪个打字测试能测出这一点,我们的测试也不假装能。

打字速度对编程重要吗?

没有人们想的那么重要,而且重要在别的地方。有人问 60 WPM 够不够当程序员,答案是够,但有个前提:如果你打符号和数字时要低头看键盘,那你敲代码的速度就不是 60 WPM。能一口气打完一行而不打断思路,比原始速度更重要,而低头看键盘恰恰会打断思路。

如何更快地打符号,以及为什么没人教

打字论坛上反复出现这样一个问题:有人字母已经能盲打到不错的速度,可一开始写代码,就又回到了找符号、找数字甚至找大写字母的状态。他们想找一种循序渐进的方法来学这些键,就像当初学字母那样,一次学几个。

符号难,一部分原因在于 Shift。在我们统计的 npm 源码中,约 45% 的符号按键是上档字符,比如 ( ) { } : 和 $,在还没算任何一个大写字母之前,就已经接近每 100 个非空格字符中的 9 个。所以先改掉 Shift 的习惯:用不打这个字符的那只手按 Shift。( 和 ) 在右手的 9 和 0 上,所以配左 Shift;! @ # $ 在左手一侧,所以配右 Shift。大多数自学打字的人什么都用左 Shift,打 ! 时就等于要求左手小指同时按两个键。检查一下自己的习惯:打一行带 @ 和 $ 的文字,看看是哪只手的小指在动。

符号很难单独练,练起来也很枯燥:字母有单词可以练,括号要放在代码里练,而随机生成的代码并不有趣。我们的办法是在真实的代码行上练符号,一次练一类。

一次练一类

下面是我们推荐的顺序,也是我们正在为练习页面开发的符号训练的顺序。在它上线之前,你也可以自己这样做:把真实的代码粘贴进自定义模式,一次练一类符号,当前这一类的准确率没到 95% 之前,不要加入下一类:

  • 数字。数字行,由基准行的手指向上伸去按。它排在第一,因为它是用得最多的非字母类别,也因为几乎每个人在这里都有坏习惯,比如用食指按 4、5、6 和 7。数字测试可以快速检查。
  • 成对的括号。先 ( ),再 [ ],然后 { }。之所以成对练,是因为你几乎从不只打其中一个:在那份 npm 源码中,( 出现了 6,195 次,) 出现了 6,194 次。把开括号和闭括号的动作当作一个整体来练,才能打得快。大多数人的节奏都断在闭括号上。
  • 运算符。= + - * / 和尖括号,以及组合形式(==、=>、+=、!=)。它们分布在数字行和右手的标点键上,有好几个需要同一只手按 Shift,这正是别扭的地方。
  • 引号和标点。' " ; : , .,大部分由右手小指完成。分号和冒号是 C 系语言和 Python 程序员差别最大的地方,所以请用你所用语言的代码行来练。
  • Shell 符号和其他零散符号。竖线、反斜杠、波浪号、反引号、脱字符、和号、井号、美元符号、at 符号和 _ 键。_ 和反引号最让人意外;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%,每个数字用基准行上正对它下方的那根手指按,然后再把数字混入普通文本中练习。

参考资料