我與歲寒
首先,先隆重介紹一下我自己,我叫歲寒,而我要向你介紹的這款輸入法叫歲寒輸入法,沒(méi)錯(cuò),你猜得沒(méi)錯(cuò),我正是歲寒輸入法的作者。這里之所以用的「臨歲之寒」的筆名,是因?yàn)樵诤?jiǎn)書(shū)上,「歲寒」這筆名已經(jīng)被人占用了,這種事情已經(jīng)不是一次兩次了,只能說(shuō)歲寒這個(gè)名字還是相當(dāng)搶手的。
「歲寒」一詞的出自論語(yǔ):子曰,歲寒,然后知松柏之后凋也。不過(guò)后來(lái),我發(fā)現(xiàn)了更時(shí)髦的解讀——「歲寒」與《冰與火之歌》中臨冬城史塔克家族的家訓(xùn)「Winter is coming」有異曲同工之妙。
開(kāi)發(fā)動(dòng)機(jī)
大多數(shù)時(shí)候,一個(gè)人做一件事情,是有其動(dòng)機(jī)的,就像殺人總得有殺人動(dòng)機(jī)是一個(gè)道理。開(kāi)發(fā)一款應(yīng)用,特別是開(kāi)發(fā)一款前途無(wú)望的應(yīng)用時(shí),動(dòng)機(jī)就變得令人好奇。其實(shí)我就是想在手機(jī)上寫(xiě)寫(xiě)東西而已。你看我文風(fēng)如此清奇,想必可以看出我是「練過(guò)的」,曾經(jīng)我的夢(mèng)想是成為一名小說(shuō)家(現(xiàn)在也還是)。我當(dāng)時(shí)嘗試了一些手機(jī)輸入法,體驗(yàn)都不能令我滿意,輸入繁復(fù),效率也一般,于是我萌生了開(kāi)發(fā)一個(gè)自己的輸入法的想法。
這是我最開(kāi)始的動(dòng)機(jī),十分簡(jiǎn)單,甚至有些中二。但動(dòng)機(jī)這個(gè)東西是會(huì)變化的,起初只是想嘗試嘗試,后來(lái)是想用它來(lái)證明自我,再后來(lái)它變成了一種堅(jiān)持,變成了一份事業(yè)。
滑行為王
那是iPhone橫空出世,Android開(kāi)始當(dāng)?shù)赖臅r(shí)代,觸摸屏的出現(xiàn)使手機(jī)的可操控性上了一個(gè)臺(tái)階,但是大多數(shù)手機(jī)仍然沿用舊有的點(diǎn)擊式輸入,在我看來(lái),這是一種極大的浪費(fèi)。當(dāng)時(shí)Swype滑行輸入法已經(jīng)問(wèn)世,但還不適合于中文輸入,卻給我?guī)?lái)了許多啟發(fā)。從那之后,利用手機(jī)的滑行特性來(lái)提高輸入的效率和趣味便成為了歲寒的核心理念,而這一理念,至今不變。
但最開(kāi)始時(shí),我所構(gòu)想的輸入法并不是現(xiàn)在這種拼音輸入方案,而基于五筆的改進(jìn)型,做了歲寒輸入法1和歲寒輸入法2,不過(guò)嘗試的結(jié)果都以失敗告終。從中,我得到的教訓(xùn)是,五筆此路不通。當(dāng)然了,我想在失敗的原因中,有一部分原因是我的輸入法界面做得太丑陋了,嗯……可能有一半吧,嗯……也可能是大部分吧,嗯……也可能是全部。
于是我放棄了在五筆方案上的嘗試,而開(kāi)始思考更為大眾所熟悉的拼音輸入方案有沒(méi)有可能與我的滑行理念取得融合。
放眼當(dāng)時(shí)江湖,拼音滑行輸入法已經(jīng)呼之欲出,像搜狗、百度、Google這些大廠嗅覺(jué)之靈敏不必分說(shuō),自然能夠意識(shí)到滑行輸入對(duì)用戶(hù)的吸引力有多大。不過(guò)他們大都因循守舊,只在舊有的qwerty布局上作錦繡文章,利用其技術(shù)上的優(yōu)勢(shì),使用數(shù)學(xué)分析的方法提取用戶(hù)滑行中的特征,從中獲得用戶(hù)的真實(shí)輸入意圖。而這種做法存在天然的缺陷,那就是滑行距離太長(zhǎng),因此效率甚至還不如點(diǎn)擊式的全拼輸入法。
與此同時(shí)也有敢于打破桎梏的,先行者有AEVIOU蜂窩式中文滑行輸入法、閃云滑行輸入法(但真的一點(diǎn)也不好用)還有盛大也湊熱鬧地做了一個(gè)盛大輸入法。難能可貴的是,他們都敢于在qwerty鍵盤(pán)上做些微調(diào)來(lái)適應(yīng)滑行輸入的需要。但問(wèn)題在于,他們并沒(méi)有走對(duì)方向——他們無(wú)一例外都選擇了動(dòng)態(tài)布局的滑行方案。所謂動(dòng)態(tài)布局,就是在用戶(hù)按下第一個(gè)字母后,據(jù)此在觸點(diǎn)中心(或在周邊)浮現(xiàn)一個(gè)新的鍵盤(pán),以讓用戶(hù)可以方便的滑行到想要的鍵位上。可能我的描述有失精準(zhǔn),但做法上大體如此。方便用戶(hù)滑行這個(gè)用意自然是很好,但同樣存在一個(gè)天然的缺陷,即每一個(gè)鍵位可能對(duì)應(yīng)一個(gè)完全不同的新鍵盤(pán),如果用戶(hù)想快速輸入怎么辦呢?好像只有把所有的變化都背下來(lái)吧。所以,這種做法在效率上也有問(wèn)題,正確的方向應(yīng)該是靜態(tài)布局。
方案上的缺陷可以通過(guò)技術(shù)上的進(jìn)步來(lái)彌補(bǔ),但不可能予以真正的解決。想要徹底解決,就要對(duì)方案進(jìn)行重新設(shè)計(jì)。這意味著要徹底打破qwerty布局對(duì)我們思維的限制,去構(gòu)想一個(gè)適合于漢語(yǔ)拼音滑行的新布局,而不是改一點(diǎn)留一片。既然不適合,就應(yīng)該推翻掉重來(lái),要相信「不破不立」。
于是,我站在一片荒地上開(kāi)始我的耕作。
布局之道
想要在靜態(tài)布局上實(shí)現(xiàn)高效的拼音滑行,一定要結(jié)合拼音的結(jié)構(gòu)特點(diǎn)才行。經(jīng)過(guò)研究,我發(fā)現(xiàn),漢語(yǔ)拼音在結(jié)構(gòu)上非常有特點(diǎn),這里我指的是數(shù)學(xué)上的排列組合,而不是音韻學(xué)上的平上去入。說(shuō)了你可能不信,我一個(gè)做拼音輸入法的人對(duì)音韻學(xué)幾乎一竅不通。
漢語(yǔ)拼音方案是利用英文已有的26個(gè)字母轉(zhuǎn)化而來(lái),在此我們應(yīng)該感謝已逝的周有光先生,感謝他的天才創(chuàng)造。這里,我把a(bǔ)、o、e、i、u、v(習(xí)慣上,我們用v來(lái)替代ü)稱(chēng)為韻母字母,除此之外的字母稱(chēng)為聲母字母,那么拼音在結(jié)構(gòu)上,存在這樣的兩條重要的規(guī)律:
除了zh、ch、sh,其它聲母就只有一個(gè)字母,而zh、ch、sh都以「h」為后綴;
在韻母中只存在3個(gè)聲母字母:n、g、r,其中r只有「er」一種情況,聲母字母總是綴在韻母字母之后,而且當(dāng)n與g同時(shí)存在時(shí),n總是在g之前。
把「er」算為特例的話,在聲母和韻母中則大量的存在3種后綴結(jié)構(gòu):h、n、g。
如果按照習(xí)慣的做法,一定要按順序滑過(guò)相應(yīng)的鍵位才能輸入相應(yīng)字母的話,我們?cè)谝粋€(gè)平面上是不可能使所有其它韻母都能夠以最短的距離靠近這3個(gè)字母所對(duì)應(yīng)的鍵位的,必然會(huì)導(dǎo)致遠(yuǎn)近不一的情況。
我問(wèn)自己,「按順序滑過(guò)相應(yīng)的鍵位才能輸入相應(yīng)字母」是否是必要的?比如我想輸入sh,我是不是一定要從「s」滑到「h」上不可?
此時(shí),我想起了高中化學(xué)里面「族」這個(gè)概念,元素周期表中的每一豎列都是一個(gè)族,在同一個(gè)族中的元素在化學(xué)性質(zhì)上會(huì)有相似之處。受此啟發(fā),我想到,如果有一群鍵位在滑行時(shí)都表現(xiàn)得像「h」,那輸入zh、ch、sh時(shí)就近滑行不就可以了嗎?n和g的情況也是類(lèi)似的。那么多少鍵位適合做這一群鍵位呢?我想,一行應(yīng)該是一個(gè)不錯(cuò)的單位。我效仿化學(xué)的概念,稱(chēng)它們?yōu)椤竓族」、「n族」和「g族」。
巧合的是,拼音中最長(zhǎng)的韻母不過(guò)4個(gè)字母,因此歲寒輸入法的鍵盤(pán)有4行,除去第一行,正好剩下3行可用,于是他們就與3個(gè)鍵族一一對(duì)應(yīng)起來(lái)了。
接著,我對(duì)韻母字母的位置作了一番研究后,發(fā)現(xiàn)u、i、v出現(xiàn)在a、o、e之前的情況更多一些,因此u、i、v放置在a、o、e之上。但這帶來(lái)了另一個(gè)問(wèn)題,u、i離n族有一行的距離,想要輸入in、ing和un的話比較麻煩。為了解決這個(gè)問(wèn)題,我引入了聲韻混合鍵——在第二行找兩個(gè)聲母作為滑行時(shí)u和i的替代,即在點(diǎn)擊時(shí)它們還是自身,但是當(dāng)從它們上滑出時(shí),它們就代表u或i了。于是,我得出了下面這樣一個(gè)布局。
再配合下列輸入規(guī)則,
- 單個(gè)的聲母或韻母直接點(diǎn)擊獲得;
- 帶h的聲母從首字母滑到第二行;
- 帶n的韻母從首字母滑到第三行;
- 帶ng的韻母從首字母滑到第四行;
- 利用y,r這兩個(gè)聲韻混合鍵可以快速的輸入un,in,ing;
- 其它的韻母依照字母順序滑過(guò)即可;
從而在一個(gè)靜態(tài)布局上實(shí)現(xiàn)了「任何一個(gè)聲母或韻母都可以在一個(gè)操作之內(nèi)完成」的目標(biāo)。可以看到,歲寒輸入法并不是只有滑行,而是將點(diǎn)擊和滑行兩種操作結(jié)合起來(lái),各取所長(zhǎng)。誰(shuí)說(shuō)滑行輸入法就一定只有滑行操作?在只有一個(gè)字母的情況下,滑行輸入就有點(diǎn)脫褲子放屁的意味了。
在此,歲寒輸入法實(shí)際上是借鑒了雙拼輸入法的核心思想,即將拼音分為聲母和韻母,并將其作為基本的輸入單位,而非全拼那樣以字母為輸入單位。所以,從一開(kāi)始,我就對(duì)外宣稱(chēng),歲寒輸入法是「雙拼變種」。說(shuō)了也許你不信,我一個(gè)做雙拼變種輸入法的至今仍沒(méi)有掌握任何一款雙拼輸入法的具體用法。
而大多數(shù)滑行輸入法都喜歡在一次滑行之內(nèi)就輸入一個(gè)拼音,你可能會(huì)說(shuō),這樣效率不是也更高嗎?在部分情況下確實(shí)如此,但將聲母和韻母分開(kāi)輸入并非多此一舉,恰恰相反,這個(gè)做法為歲寒輸入法帶來(lái)了極大的輸入靈活性,也塑造了歲寒輸入法許多與眾不同的特性。
無(wú)二義性
在設(shè)計(jì)完歲寒輸入法的布局和輸入規(guī)則后,我驚奇地發(fā)現(xiàn)歲寒輸入法呈現(xiàn)出一種非常重要的特性——輸入聲韻的無(wú)二義性。簡(jiǎn)單地說(shuō),就是任何一條滑行路徑都明確地指向某一個(gè)聲母或者韻母,不會(huì)存在歧義。
這有什么可驚奇呢?要知道,這個(gè)特性是其它許多拼音輸入法都不具備的。還是以全拼和雙拼為例。
在全拼中,如果沒(méi)有分音鍵的話,平常輸入的許多拼音都是有歧義的,比如「xian」也可能是「xi'an」,那「gang」也可能是「gan'g」,這些情況其實(shí)非常普遍。之所以平時(shí)我們感覺(jué)不出來(lái),是因?yàn)楝F(xiàn)在的輸入法都會(huì)很聰明地將兩種可能的結(jié)果都呈現(xiàn)給我們,或者預(yù)測(cè)當(dāng)下我們意圖輸入的是什么。這就是我所指的,通過(guò)技術(shù)的進(jìn)步來(lái)彌補(bǔ)方案的缺陷。
而在雙拼中稍微好一些,因?yàn)橐肓肆懵暷笧樽鳛闊o(wú)聲母情況的占位,從而實(shí)現(xiàn)在拼音層面上的無(wú)二義性。但是既然雙拼每一次輸入的都是一個(gè)聲母或一個(gè)韻母,這個(gè)時(shí)候如果我們仔細(xì)去看,雙拼在聲母或韻母的輸入是否有無(wú)二義性時(shí),就會(huì)發(fā)現(xiàn)它沒(méi)有,也不可能有。按照雙拼的分法,漢語(yǔ)拼音可分為23個(gè)聲母和33個(gè)韻母,而23+33>26*2。簡(jiǎn)單的數(shù)學(xué)計(jì)算可知,鍵位不夠表示這么多聲韻,就算是番了一翻還是不夠,所以有些韻母勢(shì)必要擠在一起共用一個(gè)鍵位,出現(xiàn)「二女共侍一夫」的情況。不過(guò)雙拼方案還是很聰明地解決了這一問(wèn)題,因?yàn)椴皇侨我獾穆暷负晚嵞付伎梢越M合成合法拼音,利用這一點(diǎn),可以在已知聲母的情況下,確定用戶(hù)輸入的韻母到底是哪一個(gè)。但這也意味著,韻母的確定依賴(lài)于已輸入的聲母。
而在歲寒輸入法中,輸入本身是自解釋的,任何一次輸入都可以明確地知道這次輸入是聲母還是韻母,是聲母是哪個(gè)聲母,是韻母又是哪個(gè)韻母,不依賴(lài)于已經(jīng)輸入的信息,也不依賴(lài)于還沒(méi)有輸入的信息。
無(wú)二義性這個(gè)性質(zhì)非常之重要,歲寒輸入法幾乎所有與眾不同的特性都是以此為基礎(chǔ)。
自然生長(zhǎng)
萬(wàn)物有靈,生命的開(kāi)始只需一顆種子和陽(yáng)光雨露,就會(huì)自然生長(zhǎng)。
歲寒輸入法對(duì)于我而言,就是這樣一個(gè)小生命,他后來(lái)的許多特性都不在我最初的設(shè)計(jì)預(yù)想之中。正像是在撰寫(xiě)一部玄幻小說(shuō),小說(shuō)的設(shè)定究竟可以如何組合演化,作者可能在動(dòng)筆時(shí)并沒(méi)有完全想好,只是覺(jué)得這個(gè)設(shè)定很酷,而當(dāng)劇情逐步演進(jìn),那些設(shè)定才會(huì)顯露出它們神奇的一面,也許會(huì)極大地出乎作者的意料。
當(dāng)我去思考如何處理無(wú)聲母的拼音的情況時(shí),我發(fā)現(xiàn),既然歲寒輸入法有無(wú)二義性,那完全不需要任何多余的操作,直接輸入韻母即可。于是我又想,為什么其它拼音輸入法中韻母如此依賴(lài)于聲母,像在全拼中,韻母可以省略,而聲母是不可以省略的,韻母的地位為何會(huì)如此不堪呢?這很大程度上,是由于漢語(yǔ)拼音中存在無(wú)聲母的情況。因?yàn)榭偸怯械臇|西沒(méi)有了,那肯定是省略了,而有可能有也有可能沒(méi)有的東西如果沒(méi)有,那就不好說(shuō)是沒(méi)有了,還是省略了。那么如果我假設(shè)所有拼音都有聲母會(huì)怎樣?于是我提出了一個(gè)概念——虛聲母,一個(gè)假設(shè)存在又從來(lái)用不著的聲母。既然所有拼音都有聲母,那么在輸入時(shí)省略聲母就不是什么奇怪的事情了。
需要指出的是,歲寒輸入法的虛聲母跟雙拼輸入法的零聲母是完全不同的,零聲母是「以有為無(wú)」,而虛聲母是「以無(wú)為有」。
虛聲母可不是純粹為了炫技而提出的,且不說(shuō)虛聲母豐富了拼音輸入的組合形式,配合歲寒輸入法的特征碼機(jī)制可以有較地降低重碼率,就說(shuō)如果沒(méi)有虛聲母,聲韻匹配機(jī)制就無(wú)從談起。
前面提到過(guò),并不是任意的聲母和韻母都可以組合成合法的拼音,比如說(shuō)「gi」這個(gè)拼音就是無(wú)效的。那如果出現(xiàn)這種情況,我應(yīng)該怎么辦呢?是應(yīng)該直接認(rèn)為用戶(hù)輸入錯(cuò)誤忽略之,還是應(yīng)該接受這個(gè)輸入但在候選區(qū)顯示一片空白,好讓用戶(hù)知道自己輸入錯(cuò)誤了呢?此時(shí),我退了一步想,為什么出現(xiàn)這種情況時(shí)一定要認(rèn)為是用戶(hù)輸入錯(cuò)誤呢?說(shuō)不定這正是用戶(hù)的意圖呢?有沒(méi)有可能他是想輸入第一個(gè)字的聲母和第二個(gè)字的韻母,不過(guò)剛好兩個(gè)不匹配而已?于是我設(shè)計(jì)了聲韻匹配機(jī)制,來(lái)幫用戶(hù)自動(dòng)完成了這個(gè)操作。
這個(gè)特性可以利用來(lái)減少輸入的次數(shù),比如我就經(jīng)常輸入「f'er」來(lái)獲得「反而」,屢試不爽。而這一切必須在引入虛聲母之后才可以,因?yàn)榈诙€(gè)字省略了聲母。
而在加入聲韻匹配之后,歲寒輸入法立刻獲得了另一種特性——輸入無(wú)錯(cuò)性。
這種無(wú)錯(cuò)性表現(xiàn)在:
用戶(hù)無(wú)法輸入不正確的聲母或韻母;
用戶(hù)輸入不匹配的聲母和韻母時(shí),會(huì)被拆成兩個(gè)拼音;
省略聲母也是正確的。
因此歲寒輸入法不存在形式上輸入錯(cuò)誤的情況。
獨(dú)特功能
除了上述的特性之外,歲寒輸入法還有許多獨(dú)特的功能。這些功能有的依賴(lài)于歲寒的特性,有的是為了解決某些場(chǎng)景下存在的問(wèn)題,也有的解決了輸入法使用中普遍存在的疼點(diǎn)。
拼音替入
雖然歲寒輸入法不存在形式上的輸入錯(cuò)誤問(wèn)題,但由于用戶(hù)操作失誤,而輸入與其輸入意圖不符合的情況卻是不可避免的。應(yīng)對(duì)這種情況,歲寒輸入法提供了一樣強(qiáng)大而簡(jiǎn)單的功能——拼音替入。
因?yàn)闅q寒可以在一次操作內(nèi)輸入任何一個(gè)聲母或韻母,再加上其輸入無(wú)二義性,也不依賴(lài)于其它已有的信息,所以替換掉任意位置的某個(gè)聲母或韻母是一件輕而易舉的事情。這無(wú)論是對(duì)于全拼,還是雙拼都是難以做到的,因?yàn)榧词姑銖?qiáng)做到了,其操作勢(shì)必也無(wú)法做到簡(jiǎn)潔明了。而在歲寒輸入法中,想要替換或插入一個(gè)聲母或韻母,操作僅僅是:選中想要操作的拼音,直接輸入正確的聲母或韻母即可。這個(gè)操作簡(jiǎn)潔到?jīng)]有一絲冗余,自然而強(qiáng)大。
截取優(yōu)先
歲寒輸入法擁有手動(dòng)造詞功能,造詞的方法是先輸入詞組的拼音,然后將詞組中的子詞組點(diǎn)擊上屏之后就自動(dòng)完成造詞。根據(jù)用戶(hù)的反饋,造詞功能在實(shí)際使用中存在這樣一個(gè)問(wèn)題:歲寒輸入法是以特征碼、等長(zhǎng)度匹配、超長(zhǎng)度匹配、不等長(zhǎng)度匹配的順序顯示候選詞的,那么在所要造的詞組中涉及選字時(shí)就會(huì)特別麻煩,因?yàn)檩斎氲钠匆粼介L(zhǎng),字的候選位置就會(huì)越靠后。
為了解決這一問(wèn)題,我加入了截取優(yōu)先功能,用戶(hù)可以選擇某個(gè)位置的拼音,命令輸入法以該位置之前的拼音作為優(yōu)先檢索的條件。
詞組回退
詞組回退功能不依賴(lài)于歲寒輸入法的任何特性,它要解決的是日常輸入中的一個(gè)疼點(diǎn),就是在輸入拼音完全正確的情況,用戶(hù)有可能手抖選錯(cuò)了候選詞,好尷尬的!我們要?jiǎng)h除掉已經(jīng)上屏的詞組,然后還要重新再輸入一遍拼音,才能選擇正確的候選詞。問(wèn)題是,有必要這么麻煩嗎?刪掉已經(jīng)上屏的詞組,和再輸入一遍拼音這個(gè)工作為什么不交給輸入法去做呢?
用戶(hù)只需要從enter鍵上向左滑出,一切就回到點(diǎn)擊候選詞之前的狀態(tài)。雖說(shuō)「落子無(wú)悔大丈夫」,但這種時(shí)候就不要那么較真了嘛。
上述三個(gè)功能,是我揀選歲寒輸入法中比較的代表性的功能,畢竟這不是使用說(shuō)明書(shū),沒(méi)有必要一一講解。其實(shí)歲寒輸入法還有其它一些功能,比如為了方便選字而加入的筆劃篩選功能,還有在用戶(hù)強(qiáng)烈要求下逐步探索后加入的連滑機(jī)制。這個(gè)連滑機(jī)制最開(kāi)始只是獨(dú)韻連滑,即只能和僅有一個(gè)字母的韻母進(jìn)行連滑,后面放開(kāi)了這一限制。但連滑機(jī)制并不是完美的——連滑機(jī)制只適用于方便某些拼音的輸入,并不能適用于全部拼音,這也是我沒(méi)有將它拿出來(lái)著重講解的原因。
歲寒輸入法也有很多不足之處,比如界面不夠美觀、詞庫(kù)不夠強(qiáng)大、智能整句功能也不夠強(qiáng)大(Android版已有,iOS還沒(méi)有)等等。但我想說(shuō)的是,這些都是技術(shù)上的不足,技術(shù)上的進(jìn)步可以彌補(bǔ)方案的缺陷,而技術(shù)上的不足卻不能夠掩蓋方案的光芒。有些技術(shù)上的難題,以個(gè)人之力確實(shí)難以克服,所以如果有認(rèn)識(shí)像馬云、馬化騰、雷軍、羅永浩這樣的人物的朋友,麻煩幫助引薦引薦,在此提前謝過(guò)。
如果你想了解更多關(guān)于歲寒輸入法的信息,可以查看歲寒輸入法iOS版使用教程;如果你想下載歲寒輸入法的話,Android用戶(hù)請(qǐng)前往酷安的歲寒輸入法頁(yè)面,iPhone用戶(hù)請(qǐng)前往App Store搜索「歲寒輸入法」,這里需要說(shuō)明一下,Android歲寒輸入法是免費(fèi)的,而iOS歲寒輸入法是付費(fèi)的,售價(jià)為3元人民幣。
寫(xiě)在最后
歲寒輸入法于我已經(jīng)不是一款應(yīng)用那么簡(jiǎn)單了,他更像是我的孩子。最開(kāi)始他蹣跚學(xué)步,跌跌撞撞,如今已能微微站定,他想朝大家揮手,想得到這個(gè)世界投射過(guò)來(lái)的目光。如要問(wèn)歲寒今年幾歲?我想,大概是有6歲了吧。