盲人程序员的编程生涯

本文来自于Stackoverflow上的一个问题,下面确实有很多盲人程序员作出回答,笔者感触颇深,故整理成文。

具体技术细节不必深究,主要了解一下他们的工作状态,以期让更多的朋友关注残障人士的生活与工作。

  原问题大致如下:

  视力应是大多数程序员理所当然应有的感官之一,大多数程序员都会花大量的时间盯着显示器(尤其是当他们处于巅峰状态时),不过我知道还存在很多的盲人程序员(比如目前供职于Google的T.V. Raman)。

如果你是个盲人(或者视力衰退严重),那么你会怎样设置你的开发环境来协助你编程呢?

  下面整理一些精彩回答:

  From Jared:

  是一个完全失明的大学生,已经参加过几个编程实习,所以我的回答将基于这些经验。我使用Windows XP作为操作系统,使用Jaws的合成语音来阅读屏幕上的内容。对于Java编程,我使用Eclipse,因为它是一个全功能可访问的IDE。


  以我的经验来看,Java编程中使用SWT作为GUI工具的可访问性要比使用Swing好一些,这就是为什么我放弃NetBeans的原因。对于.NET编程,我使用Visual Studio 2005,因为这是我实习时使用的标准版本,而且通过使用Jaws和一系列脚本(比如简化表单设计的脚本),可以使操作变得非常简单。


  对于C和C++编程,我使用Cygwin加上GCC作为编译器,使用Emacs或者Vim作为编辑器,视具体工作而定。我的大部分实习涉及到Z/OS的编程,我使用一个登录会话来通过Cygwin来访问USS子系统,并且使用C3270作为我的3270模拟器来访问主框架的ISPF部分。


  我一般依赖于带点字(Braille:点字/盲文)显示(译者注:下图为一种点字设备)的合成语音。我发现在标点很重要且比较复杂的情况下使用点字显示的话,工作效率会更高。一个例子就是当有很多if声明很许多嵌套的括号和JCL时,标点就显得非常重要了。


更新


  我在玩Cygwin下的Emacspeak我不确定这个作为编程使用的编辑器是否有用,因为它有时好像反应迟钝,不过我还没有查看任何配置选项。


  

    From Saqib


    我是个盲人,我已经使用Windows、Mac、Linux和DOS编程大约13年了,使用的语言从C/C++、Python、Java、C#到各种小众语言。尽管原问题是关于环境配置的,不过我认为最好应该从盲人如何使用电脑开始回答。


  有些人使用有声环境,例如T. V. Raman楼上提到的Emacspeak环境。迄今为止更通用的解决办法是使屏幕阅读器运行在后台,并监视操作系统的活动,然后通过合成语音或者物理点字显示(一般一次显示20至80个字符)提醒用户。这就意味着盲人可以使用任何可访问的应用程序了。


  那么,我自己这些日子在用Visual Studio 2008,只做了很少的更改。我关掉了一些诸如在输入时显示错误等功能,因为我发现这个功能很容易使你分心。在加入微软行列之前,我的所有开发工作都在类似记事本(Notepad)这样的标准的文本编辑器中完成,所以仍然没有任何自定设置。


  让屏幕阅读器读出缩进也是可能的,我自己不用这个功能,因为Visual Studio会处理这些,并且C#中是用大括号的。但是在像Python这样空格很关键的语言中就很重要了。最后,Emacspeak可以使用不同的声音/音高来指出语法的不同部分(关键字、注释、标识符等)。


  From Manish


  我是个盲人,已经编程大约12年了。目前我是Sapient Corporation(一个剑桥的顾问公司,专注基于Web的和胖客户端的企业解决方案)的高级架构师。我使用几个屏幕阅读器,不过大部分是在Windows上使用的Jaws和NVDA。


  我大部分在微软平台上工作,使用Visual Studio作为开发环境。我也使用像MS SQL企业版以及其他的数据库操作工具、网络监控工具等。我曾尝试花些时间使用Emacspeak,不过由于我的工作大部分基于MS平台,所以不会在那上面花太多时间。我也花过几年在Linux上使用C++,大部分时候是在Windows上使用记事本或者Visual Studio完成所有的编码工作,然后用Samba与Linux环境共享文件。我也使用Borland C来做些小实验。最近在玩Python,它普遍被认为是对盲人用户最不友好的程序语言,因为它使用缩进作为嵌套机制。说到这里,最流行的开源屏幕阅读器NVDA就完全是用Python写的,而且这个项目的一些贡献者本身就是盲人。一个很有意思的问题就是,我经常被问到,作为一个架构师我是如何处理各种图表的(UML、Viso以及Rational Rose等等)。Visio可能是最易操作的图表工具了,我还可以写Jaws脚本来为我读出Rational Rose图表。我曾用过一个叫T-dub(technical diagram understanding for the blind)的工具来处理UML 2.0图表,它是一些德国大学开发出来的。我还用过一个基于Java的非常丑陋的工具叫做Magic Draw来处理模型驱动(model-driven)的开发工作,并且作为androMDA项目的一个提交者(commiter)协助开发了从UML模型生成.Net代码的生成器。


  总体来说,我发现我的自力更生激励了整个团队。例如,当一个图表对沟通/文档化一个设计非常重要时,实际的设计过程牵扯到大量的思考和头脑风暴,并且当设计定稿时,你的一个队友可以帮你快速将其整理为一个干净整齐的图片。人们通常将这种情况视为缺乏独立性或能力,而我却认为这是纯正的相互依存,因为我很确定那个队友靠他/她自己或者几人轮流都不可能想出那样的设计,如果我依赖他将设计文档化也是如此。我遇到的大部分障碍都是基于工具的不可访问的问题。例如所有的Oracle的产品都鼓吹其访问性好多年了(鄙视他们),但在团队环境中却只搞了个在屏幕阅读器和自定义脚本之上的额外的防御层。


  From Edward Kmett


  我为大底特律盲人辅导会(Greater Detroit Society for the Blind)工作三年了,运营一个为盲人访问量身定制的BBS,并且和很多盲人用户一起工作探寻如何能够更好地满足他们的需求,并帮助新的盲人用户训练他们使用软件和硬件。如果不出意外的话,我至少学会了阅读点字(盲文)来防止万一我遇到跟他们一样的处境。


  大部分盲人计算机使用者及程序员使用类似屏幕阅读器的东西。Jaws在某种程度上是最受欢迎的。幸运地,现今的大多数应用程序都提供了某种形式的残障人士访问方式。你可能需要将你的环境稍微调整一下,让它少说一些,比如,可以考虑禁止Visual Studio中的智能感知(Intellisense)。


  点字显示设备就不那么常用了,相比之下也贵很多,它可以显示40或80列文本,而且可以用在当精确定位/标点很重要的场合。而屏幕阅读器可以配置成快速读出标点,很多人发现它容易令人分心,其实通过它可以很容易找到适合自己的方式。Jaws可以配置成显示驱动的,因此你无法兼顾可访问性应用程序。


  同时,很多法律上的盲人用户仍然有一点遗留的视力。使用高对比度的背景和放大功能可以帮助很多这样的用户。


  在Windows中使用ToggleKeys可以在你不小心敲击了”caps lock“、”num lock“、”scroll lock“等健时让你能够听到。


  我知道至少有一个Haskell(译者注:一种纯函数式编程语言)程序员使用屏幕阅读器,并且不使用Haskell的布局规则直接编程,并且不使用非惯用(non-idiomatic)的选项,而是用支持{;}的。因为它不会使阅读器读出大量的标点,而且还得计算出Haskell布局规则中精确的缩进,这样他就不会太过分心。同样的,我还听说一些盲人程序员在写Python的时候发些牢骚。


  最终,你还是要学会发挥自己的长处。


  From Kyle Burton


可以从Blinux项目开始:这个项目描述了如何获得Emacspeak(带文本阅读的编辑器)并且还有许多其他资源。

我曾经跟这样的一个人工作,他的视力导致他不能使用显示器,但他使用屏幕阅读器软件并花费大量时间使用基于文本的应用程序和shell也工作得很好。

维基百科上有个屏幕阅读器得列表,也可以从这里开始:


  From ifwzh


  我是来自中国北京的一个研究生,我是计算机科学专业的并且大部分工作是编程。我天生弱视,需要使用放大工具才能看清屏幕上的文字。我在Windows上使用微软的放大镜工具,在Linux上使用compiz的放大插件。我一般将工具设置成放大原始字体的三倍。对于我来说,放大工具就够了,主要问题是速度,我需要移动鼠标来确保指针跟随我所看到的文本,微软的放大镜提供了一个选项”自动跟随文本编辑光标“,这可以让我在编辑文本或编码时摆脱频繁移动鼠标的困扰。但是这招并不总是管用,因为编辑软件或者IDE可能不支持。Linux上的放大工具比较难用。KDE中自带的KMag拥有令人恐怖的刷新率,让我的眼睛很不舒服,我现在使用的compiz的放大插件还可以,不过没有自动聚焦功能。对我来说,iOS提供了十分完美的全屏放大解决方案,尤其是iPad的9.7英寸显示屏。它们的自动聚焦就没必要了,因为我很少用它们编辑或编码。安卓(Android)系统只提供了非常少的可访问性功能,只有像摇动反馈这样的功能,对我根本没用。在安卓上没有什么放大工具,更别提像iOS上这种全屏放大的功能了。我以前研究Qt,希望做一个Linux上好用的放大工具,甚至是安卓上的,不过很难有什么进展。


    通过以上一些回答,我们可以大致了解一些盲人程序员每天的工作状况,我很惊讶居然有这么多盲人程序员,对于我们来说,可能蒙上眼睛就什么也干不了了,真的很敬佩这些同仁们!

      我也希望能够通过本文让更多Web开发者更加关注网站的可用性及可访问性问题,更多地关注残障人士。

 

 

        老程序员的忠告:不要做浮躁的软件工程师 

 IT人生路精彩博文精选导读 

成为Java高手的25个学习目标--非常经典 

为程序开发人员量身定制的12个目标 

程序员编程技术迅速提高的终极攻略

最新“特色985”大学高校名单 

健康养生博文精选

Android技术开发精彩博文精选导读     

中国最高等级实验室——“国家实验室”名单(仅20所)

2011年3月最新“211工程”大学名单(共112所)

技术精英谈IT程序员的出路在哪里——很经典

让IT人远离慢性疲劳,长时间操作电脑需要养成的几个好习惯 

技术开发人员应该多吃的15种健康食品 

周立功谈嵌入式:我的25年嵌入式生涯

IT技术开发人员35岁之前应该做的十件

技术开发人员为什么会无奈苦逼?

印度和中国程序员的区别 

 

 

 

好的,下面是一个基于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的盲人报时钟的代码实现。需要注意的是,具体的实现细节可能因为不同的硬件平台和编译工具而有所差异。如果您需要更详细的帮助,可以提供更具体的信息,我会尽力为您提供帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值