驚嘆!一個(gè)盲人程序員的真實(shí)獨(dú)白
我認(rèn)為你第一次看到我的工作間肯定這樣想 —— “總感覺少些什么”。沒有顯示器和鼠標(biāo),卻有個(gè)人敲打著鍵盤,不知注視著哪里。
這就是我,我同事可以證明我沒問題。我是位于坦佩雷(芬蘭西南部一座城市)的 Vincit 寫字樓中的一名軟件開發(fā)者。我雙目失明。這篇文章中我將講述有關(guān)我工作中的事情。
你真的什么都看不到嗎?
準(zhǔn)確來說,我覺察到陽光和其他明亮的光線,不過也僅限這些。其實(shí),這對(duì)我的工作也并沒有什么幫助。
你工作內(nèi)容是什么?
和大部分人一樣:忙時(shí)寫代碼,閑時(shí)和同事吹逼。我做全棧項(xiàng)目,主攻后端。兼職訪問顧問 – 或稱監(jiān)管,隨你如何稱呼。
你如何使用電腦?
我用的電腦是一臺(tái)運(yùn)行 Windows 10 的普通筆記本。是其中的軟件讓一切變得神奇。我使用一款叫做屏幕閱讀器的程序來訪問電腦。屏幕閱讀器監(jiān)聽屏幕上的變化并通過盲文(需要單獨(dú)的盲文設(shè)備)或合成的聲音來展示給用戶。這并不是你如今聽到的各種智能助理的合成聲音。我使用一種機(jī)械聲音,每分鐘能說 450 個(gè)單詞。相比較而言,英語正常語速每分鐘 120-150 個(gè)單詞。我有一個(gè)怪癖:我既說英語也說芬蘭語,我用芬蘭語合成器讀英語,因?yàn)槔吓f的屏幕閱讀器在語言之間切換不夠智能,所以我習(xí)慣這樣做。下面是個(gè)例子是閱讀這個(gè)段落,我能聽懂。
下面是英語合成器發(fā)出的聲音:
鼠標(biāo)對(duì)于我來說并不是非常有用,所以我僅僅通過鍵盤工作。在座的各位應(yīng)該十分熟悉我用到的命令:方向鍵和 tab 鍵控制窗口內(nèi)的移動(dòng),alt+tab 切換窗口等等。屏幕閱讀器也有很多自己的快捷鍵,比如閱讀活動(dòng)窗口的不同區(qū)域或開關(guān)一些功能特性。
有趣的是閱讀網(wǎng)頁和其他格式化文檔。你看,屏幕閱讀器分塊呈現(xiàn)信息。每一塊可能是一行,也可能是一個(gè)單詞、一個(gè)字母,亦或是文本的片段。舉個(gè)例子,我在網(wǎng)頁中按向下的方向鍵,我聽到頁面的下一行。我并不能像正常人一樣用眼睛從屏幕上閱讀內(nèi)容。相反,我聽到一塊一塊的內(nèi)容,或跳過我不感興趣的部分。
語音或盲文并不能描繪出窗口的顯示布局。信息以線性方式呈現(xiàn)給我。如果你把網(wǎng)頁復(fù)制粘貼進(jìn)記事本,你就能明白我看到的網(wǎng)頁是什么樣子的。就是剝離大部分格式的多行文本。然而屏幕閱讀器可以獲取網(wǎng)頁上的 HTML 語法,所以我也能知道超鏈接、標(biāo)題、表單等等。事實(shí)上,如果非復(fù)選框元素展示成復(fù)選框樣式,我并不能知道這是復(fù)選框。我之后將寫一篇文章詳細(xì)講述這些內(nèi)容,記住我剛剛舉的是個(gè)“反人類”例子。 (譯者注:突然感到自責(zé)和羞愧,深深明白了一個(gè)道理:不要用各種有含意義的傳統(tǒng)標(biāo)簽 hack 布局和樣式,也不要因?yàn)?css 的強(qiáng)大而懶得使用各種有含義的傳統(tǒng)標(biāo)簽。共勉)
我花費(fèi)大量時(shí)間工作在命令行上。事實(shí)上我通常用瀏覽器和編輯器,很少用其他圖形應(yīng)用程序。相比那些為鼠標(biāo)用戶打造的圖形界面,我發(fā)現(xiàn)用命令行處理手邊的工作更加高效。
既然我如此熱愛命令行,為什么我卻要選擇 Windows 這個(gè)并不以命令行出名的操作系統(tǒng)呢?答案很簡單:Windows 是最方便的操作系統(tǒng)。 NVDA 是我所選擇的屏幕閱讀器,它是開源的并且維護(hù)比其他閱讀器更頻繁。如果上天再我一次機(jī)會(huì),我可能會(huì)選 Mac 系統(tǒng),因?yàn)槲艺J(rèn)為它是易用性和功能性平衡的典范。不幸的是 Mac 系統(tǒng)上的屏幕閱讀器 VoiceOver 經(jīng)歷了漫長的發(fā)布周期從而被遺忘,并且它的導(dǎo)航模型和我獨(dú)特的工作方式并不協(xié)調(diào)。當(dāng)然這里也有一個(gè) Gnome 桌面上的屏幕閱讀器 ,雖然用戶很少,依然被很好地維護(hù)著,不過還有一些不完善的地方和我日常工作不協(xié)調(diào)。所以,我選擇 Windows。由 GNU 誕生的 Git Bash 和其他命令行工具彌補(bǔ)了 Windows 內(nèi)置命令行的缺陷。
你如何寫代碼?
我花費(fèi)好長時(shí)間才明白為什么大家覺得這個(gè)問題是個(gè)很高深的問題。記得我上面說過一行一行地閱讀文本嗎?我也是通過這種方式讀代碼。通常我會(huì)跳過無用的行,或僅聽半行來獲取內(nèi)容,但當(dāng)我需要知道完整信息的時(shí)候,我不得不像讀小說一樣讀完所有東西。我當(dāng)然無法閱讀整個(gè)代碼庫。這種情況下我會(huì)在腦中抽象一部分代碼:這個(gè)組件輸入 x 返回 y,并不用關(guān)心細(xì)節(jié)邏輯。
這種閱讀方式讓我和正常同事的工作方式有些區(qū)別。舉個(gè)例子,當(dāng)代碼審查時(shí),我喜歡看原始 diff 輸出,并列窗口顯示 diff 對(duì)我并不適用,而且還容易讓人分心。有修改的代碼行上用符號(hào) + 和 – 比用不同背景色標(biāo)注也要好太多,并不是因?yàn)槲也荒塬@知顏色名字,而是因?yàn)樵谛略龅囊恍兄?,讀“加”這個(gè)字比讀“帶復(fù)雜陰影的高亮紅色”用更短的時(shí)間。(嘿,我說你呢 Gerrit (一款代碼審查工具))
你或許會(huì)認(rèn)為縮進(jìn)和其他代碼格式和我無關(guān),因?yàn)槎际腔镜囊曈X問題。并不是這樣,正確的縮進(jìn)對(duì)我的幫助和正常開發(fā)者一樣。當(dāng)我用盲文(比語音更加高效)讀代碼時(shí),我像其他正常程序員一樣清楚代碼結(jié)構(gòu)。當(dāng)我進(jìn)入一段有縮進(jìn)或無縮進(jìn)的代碼時(shí),我也會(huì)得到語音提醒。這些信息幫助我在腦中描繪代碼結(jié)構(gòu)。事實(shí)上我學(xué)的第一門語言就是 Python (PHP 不算),它強(qiáng)制使用代碼縮進(jìn),這對(duì)我來說并不是問題。我有眾多理由來強(qiáng)烈建議使用整潔統(tǒng)一的代碼風(fēng)格,其中之一就是不要讓我的生活變得更加艱難了,好嗎。
你喜歡哪款編輯器?
劇透一下:這個(gè)答案并不是以 V 或者 E 開頭(我雖然通過命令行用 Vim 來寫 git commit 信息和其他備注。我認(rèn)為我在這場圣戰(zhàn)中是中立的)(譯者注:Vim 和 Emacs 梗)一年前我認(rèn)為 Notepad++ 最棒,它是輕量級(jí)的做工精細(xì)的文本編輯器。然而一年前我還沒有接觸大規(guī)模 Java 項(xiàng)目,當(dāng)我接觸這種項(xiàng)目時(shí),意味著我應(yīng)該在 Notepad++ 和理智之間做個(gè)選擇。最后我選擇理智,拋棄 Notepad++ 轉(zhuǎn)投 IntelliJ IDEA 的懷抱。從那之后 IntelliJ IDEA 便是我首選編輯器。我曾對(duì)各種 IDE 有深深怨念,它們大多數(shù)在純鍵盤流操作下麻煩又低效。如果我視力沒問題,我肯定早就跳到 IDE 陣營了。
但你可能會(huì)問,為什么當(dāng)初選 Notepad++。還有其他很多更先進(jìn)的輕量級(jí)編輯器,比如 Sublime 或 Atom。原因很簡單:屏幕閱讀器無法訪問它們。Vim 一類的文本編輯器也是如此,我使用的屏幕閱讀器對(duì)命令行程序的支持有問題,在這些編輯器上無法處理多于 commit 信息的文本。很遺憾,可用性決定了我能夠使用的工具。即使我不能高效工作,也不是什么大問題。
你編寫過前端代碼嗎?
你應(yīng)該認(rèn)為前端開發(fā)和視覺有關(guān),注定與盲人程序員無緣?;旧鲜沁@樣。我從來不自己做概念原型,我做都是有界面,需要隨后加入功能的項(xiàng)目。
然而,我也做過 Angular 和 React 工作任務(wù)。怎么會(huì)這樣?如今很多 APP 基于瀏覽器。舉個(gè)例子,我曾花費(fèi)兩周時(shí)間為一個(gè) Angular APP 增加國際化支持。我并不需要做任何視覺上的改動(dòng)。
我發(fā)現(xiàn)對(duì)于我這類開發(fā)者開說,像 Bootstrap 這類的庫簡直是上天的禮物。正因?yàn)闁鸥裣到y(tǒng)(Bootstrap的響應(yīng)式布局解決方案),我可以自己構(gòu)建一個(gè)粗糙的界面。盡管如此,我做的有關(guān)界面的改動(dòng)在呈現(xiàn)給用戶之前仍然要有一雙眼睛檢查。所以,總而言之,我可以在一定程度上做些前端開發(fā),至少不是和表現(xiàn)層太相關(guān)。