盲人程序员如何编程?全靠每分钟450个单词

640?wx_fmt=png

昨天有人给我发了一篇文章,我一看到图就觉得很奇怪,这个人坐在一个小隔间里,戴着耳机,敲着键盘,但是他的面前却没有屏幕, 他在干什么?

他叫Tuukka Ojala, 是一个Web开发程序员,他坐在那里编程。

但是,他是一个盲人。

如何使用电脑?

盲人使用电脑都很不容易,怎么编程呢?Tuukka Ojala使用了一个屏幕阅读器的软件,可以把屏幕上的文本变成布莱叶盲文(需要特殊的盲文显示设备)或者合成的语音。 

这种合成的语音语速非常快,每分钟要说450个单词,而正常的语速是120-150个单词。

大家感受下这疯狂的语速:

对普通人来说,这语速太快了,但是Tuukka Ojala已经练出来了,这速度不在话下。 

鼠标对Tuukka Ojala来说是没用的,他主要用键盘,用箭头键/Tab键在一个窗口内移动,用alt+tab在窗口之间切换。屏幕阅读器也有一些快捷键,可以读取窗口各个部分的文本。

但是当“阅读”网页的时候,他就和普通人不一样了,因为普通人可以快速地浏览,而他不得不一行一行地去听那些文本。 

Tuukka Ojala 在命令行上花费了很多时间,除了浏览器和编辑器之外,他很少使用GUI程序,他也发现命令行通常比GUI做事情更快。 

Tuukka Ojala 主要用Windows办公,既然主要用命令行,为啥不使用Linux?  这是因为Windows 有着最好的Accessibility (无障碍访问),并且有一个开源的,很活跃的屏幕阅读软件NVDA。虽然Windows有些固有的不足,但是通过使用Git Bash,也算是有了一些补偿。

如何编程?

那他到底怎么去编程呢?  比如怎么去阅读代码?  

实际上Tuukka Ojala 必须像听小说一样去听这些源代码,如果代码库很大,他是听不过来的,在这种情况下,他必须把一些代码在脑海中抽象一下:这个组件使用x作为输入,然后返回y, 而不考虑具体的实现细节。

我觉得这是很有难度的,普通程序员拥有在代码中导航的奢侈能力,但对于Tuukka Ojala来说只好尽可能把代码给记住,他自己也承认由于看不见,他的记忆力反而发达了。

你可能觉得像缩进和代码格式化对于盲人来说是什么用处的,实际上不是这样,当他使用布莱叶盲文来“阅读”代码的时候,这能给他一个很好的感觉,让他知道在什么地方,就像视力正常的程序员一样。

另外当他把一个代码块缩进的时候,也会有语音的提示,这让他在脑子中画出一张代码的地图,所以清晰良好的代码风格对Tuukka Ojala也是一件好事。

使用什么IDE?

一年前,他主要用Notepad++,一个轻量级、制作精良的编辑器, 虽然还有一些更高级的轻量级编辑器例如Sublime和Atom,但是他的屏幕阅读器和这些工具之间没法良好协作 --- Accessibility 是头等大事。 

后来由于要开始大型的Java项目,他开始转向了 IntelliJ IDEA,从此IDEA一直是他的首选。他是他对IDE有一种根深蒂固的反感,因为他觉得对Accessibility 支持不好,并且效率低下。 

作为盲人,怎么和前端代码打交道?

前端开发是可视化的,盲人很难参与,但是Tuukka Ojala 却做过相当一部分Angular和React工作,例如他曾经花了几个星期,对一个Angular应用增加了国际化的支持,他根本不需要视觉的支持。

像Bootstrap这样的库对他来说是天赐之物,利用其中的网格系统,他可以设计用户界面的粗略版本,当然,在真正交付之前,还需要经过人眼确认一遍。这至少说明,他可以开发前端代码到一定的程度,只要不触及太多的表示层。 

刚看到这篇文章的时候觉得惊奇,看完后就觉得震撼,我脑海中想象着他编程的场景:

一边听着屏幕阅读器发出的声音,一边在脑海中建立程序的结构,思考该如何写代码,输入代码,屏幕阅读器给他反馈,然后运行,出了问题还要去调试,还得靠听......  

看起来轻而易举的事情,对他来说得付出更多的努力才行。

最后再给这位帅哥来个正脸,向他致敬:

640?wx_fmt=jpeg

文章来源: 

https://www.vincit.fi/software-development-450-words-per-minute/

往期 精彩回顾

640?wx_fmt=jpeg

好的,下面是一个基于Verilog HDL的盲人报时钟的代码实现。 首先,我们需要确定时钟模块的输入输出端口。时钟模块的输入端口需要包括一个时钟信号和一个复位信号,输出端口需要输出当前的时、分、秒。 ```verilog module clock( input clk, // 时钟信号 input rst, // 复位信号 output reg [3:0] hour, // 时 output reg [5:0] minute, // 分 output reg [5:0] second // 秒 ); ``` 接下来,我们需要在时钟模块中定义一个计数器,用于记录当前的时、分、秒。每当计数器的值达到一定的阈值时,我们就可以更新时、分、秒的值。同时,我们需要实现一个报时功能,当时分秒满足特定条件时,时钟模块就会输出报时信号。 ```verilog module clock( input clk, // 时钟信号 input rst, // 复位信号 output [3:0] hour, // 时 output [5:0] minute, // 分 output [5:0] second, // 秒 output reg beep // 报时信号 ); reg [3:0] cnt_hour; reg [5:0] cnt_minute; reg [5:0] cnt_second; always @(posedge clk or posedge rst) begin if (rst) begin cnt_hour <= 0; cnt_minute <= 0; cnt_second <= 0; beep <= 0; end else begin cnt_second <= cnt_second + 1; if (cnt_second == 60) begin cnt_second <= 0; cnt_minute <= cnt_minute + 1; end if (cnt_minute == 60) begin cnt_minute <= 0; cnt_hour <= cnt_hour + 1; end if (cnt_hour == 24) begin cnt_hour <= 0; end end end always @(cnt_hour, cnt_minute, cnt_second) begin beep <= 0; if (cnt_second == 0 && cnt_minute == 0 && cnt_hour == 0) begin beep <= 1; // 整点报时 end else if (cnt_second == 0 && cnt_minute == 30) begin beep <= 1; // 半点报时 end end assign hour = cnt_hour; assign minute = cnt_minute; assign second = cnt_second; endmodule ``` 在时钟模块中,我们使用了三个计数器来分别记录当前的时、分、秒。每当计数器达到一定阈值时,我们就会将其重置,并更新时、分、秒的值。同时,我们使用了两个if语句来实现报时功能。当时分秒满足特定条件时,我们就会将报时信号置为1。最后,我们将时、分、秒的值通过assign语句输出到对应的输出端口。 当时、分、秒满足报时条件时,我们可以通过一个蜂鸣器模块来实现报时的声音。蜂鸣器模块的输入端口需要包括一个时钟信号和一个报时信号,输出端口需要输出蜂鸣器的声音。蜂鸣器模块的代码如下所示。 ```verilog module buzzer( input clk, // 时钟信号 input beep, // 报时信号 output reg out // 蜂鸣器输出 ); reg [23:0] cnt; always @(posedge clk) begin if (beep) begin cnt <= cnt + 1; if (cnt == 1000000) begin out <= ~out; cnt <= 0; end end else begin out <= 0; end end endmodule ``` 在蜂鸣器模块中,我们使用了一个计数器来控制蜂鸣器的输出。当报时信号为1时,计数器会不断累加,直到达到一个阈值时,我们就会将蜂鸣器的输出反转一次。这样就可以实现蜂鸣器的报时声音了。 最后,我们需要将时钟模块和蜂鸣器模块进行连接,以便实现完整的盲人报时钟。连接的代码如下所示。 ```verilog module clock_buzzer( input clk, // 时钟信号 input rst, // 复位信号 output [3:0] hour, // 时 output [5:0] minute, // 分 output [5:0] second, // 秒 output reg out // 蜂鸣器输出 ); wire beep; clock clock1(clk, rst, hour, minute, second, beep); buzzer buzzer1(clk, beep, out); endmodule ``` 在连接模块中,我们首先定义了一个wire类型的beep信号,用于连接时钟模块和蜂鸣器模块。然后,我们将时钟模块和蜂鸣器模块进行连接,将beep信号作为输入端口进行连接。最终,我们就可以通过clk信号来控制整个盲人报时钟的运行了。 这就是一个基于Verilog HDL的盲人报时钟的代码实现。需要注意的是,具体的实现细节可能因为不同的硬件平台和编译工具而有所差异。如果您需要更详细的帮助,可以提供更具体的信息,我会尽力为您提供帮助。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值