盲ろう者がプログラミングを習得するまで|Visual Studioを使いC#でコードを書く楽しさ

 はじめに
この記事では、プログラミング初心者だった盲ろう者のぼくが、スクリーンリーダーのNVDAと点字ディスプレイを使い、Visual StudioとC#でクイズゲームを作るまでの過程を紹介します。
プログラミング言語や参考書の選び方、Windows Formsで苦労したこと、視覚に頼らず学習するために準備したものなどを、実体験に基づいて説明します。

プログラミングをやってみようと考えた理由
世の中がコロナ禍にあり、政府から不要不急の外出を自粛するよう「緊急事態宣言」が出されていた頃のことです。
職場では、勤務時間が短縮されたり、通勤を自粛するよう要請されたりしたため、外出の機会が減り、自宅で過ごす時間が増えました。単純に、このことを喜んだ人もいるでしょう。しかし、盲ろう者の場合はどうでしょうか。
自宅でできることは限られています。家にいても、やることがほとんどありません。テレビを観ることはできませんし、電話で誰かとおしゃべりをしたくても、それも難しいのです。
「何か、おもしろいことはないだろうか」
せっかく増えた自宅での時間を有効に使いたい。そう考えていたとき、ふと思い出したのが、コンピュータープログラミングでした。
ずいぶん前に、C言語の点字書を読んで、プログラミングを勉強しようとしたことがありました。当時は、現在のようなWindows上の統合開発環境を使うのではなく、メモ帳でコードを書き、コマンドプロンプトでコンパイルする方法を試していました。コンパイルとは、書いたコードを、コンピューターが実行できる形に変換する作業です。
参考にしたのはC言語の基礎を扱った本でしたが、内容が小難しく感じられ、なかなか頭に入りませんでした。実際にコードを書くところまでほとんど進めず、すぐに挫折してしまいました。
出会った本が、自分には合っていなかったのでしょうか。

スクリーンリーダーと点字ディスプレイでパソコンを操作する
ぼくは高校生の頃から、プログラミングに興味を持っていました。当時はBASICという言語がよく使われ、パソコンもCUIと呼ばれる、文字を中心に操作する時代でした。テキストエディターでコードを書けばよかったのです。
画面に表示された文字情報は、パソコンに接続した点字ディスプレイに、点字として出力することができました。簡単に言えば、プリンターで文字を印刷するのと似た仕組みです。
プリンターで印刷するために専用のソフトが必要であるのと同じように、画面上の文字情報を音声や点字に変換するためには、スクリーンリーダーが必要です。
そして何より、その当時はパソコンも点字ディスプレイも高価で、簡単には手に入りませんでした。

テキストベースからグラフィック中心の画面へ
その後、GUIが一般的になり、パソコンの画面では、アイコンや画像などのグラフィック表示が当たり前になっていきました。
グラフィック画面を音声や点字で十分に確認する技術が整っていなかった時代、盲ろう者であるぼくは、コンピュータープログラミングにあまり興味を持てなくなっていました。
パソコンは、どちらかというとテレビと同じように、自分には使えないものだと思い込んでいたからかもしれません。

パソコンが身近なものになる
時代は変わり、パソコンは以前より安価になりました。点字ディスプレイも、公的な福祉制度を利用して購入できる場合があるため、少しずつ身近なものになっていきました。
パソコンが1台あると、さまざまな作業ができます。ワープロソフトで文章を作成したり、住所録ソフトでアドレス帳を管理したりすることもできます。
それまで、視覚障害者が活字の文書を作成するときには、自分で点字の原稿を作り、それをボランティアに渡して、活字に書き起こしてもらう必要がありました。点字を活字に直すことを「墨訳」と呼んでいました。
そのような時代だったので、パソコンを使い、自力で文書を作成できることは、ぼくにとって大きな魅力であり、喜びでもありました。
ちなみに、ぼくが最初に使っていたワープロソフトは、一太郎とWordPerfectでした。

言語の選択と開発環境の準備

プログラミング言語を選ぶ
プログラミングを始めようと考えたとき、最初にしなければならなかったのは、使用するプログラミング言語を選ぶことでした。
BASIC、C言語、C++、C#、Javaなどには、以前に少しだけ触れたことがありました。数多くあるプログラミング言語の中から、最終的に選んだのがC#(シーシャープ)です。
C#は、マイクロソフトが開発したプログラミング言語です。汎用性が高く、さまざまな種類のアプリケーションを開発できます。Windowsアプリはもちろん、開発環境や仕組みを組み合わせることで、スマートフォン向けのアプリなどを作ることもできます。

Visual Studioを使う
使用する言語を決めたら、次にC#のコードを書くための開発環境を選ぶ必要がありました。
Windows標準のメモ帳を使ってコードを書くこともできますが、プログラミングには、コードの入力、実行、エラーの確認などをまとめて行える「統合開発環境」と呼ばれるソフトがあります。
統合開発環境では、エディターでコードを書き、コンパイラーを使って、コンピューターが実行できる形に変換します。
ぼくが最初に触った統合開発環境は、Visual Studio 2005でした。しかし、当時のVisual Studio 2005は、スクリーンリーダーや点字ディスプレイで十分に操作できませんでした。
Visual Studioのエディターに書かれた内容や、画面のレイアウト、デザインなどを点字で確認することが難しく、残念に思ったものです。

スクリーンリーダーとVisual Studioのアクセシビリティが向上
コロナ禍にあった2020年、改めてVisual Studioを使ってみました。そのとき、
「おお、すごい!」
と驚いたことを覚えています。
Visual Studioの画面に表示された文字情報が、点字ディスプレイにも表示されるようになっていたからです。もちろん、画面上のデザイナーや画像、ラベルの配置など、点字では十分に確認できない部分も残っていました。
そのときに使ったのは、Visual Studio 2019です。以前と比べると、かなりアクセシブルになっていました。
点字ディスプレイでVisual Studioを操作するために、ぼくはNVDAというスクリーンリーダーを使用しました。NVDAは無料で利用できるにもかかわらず、多くの機能を備えています。オーストラリアの視覚障害のあるプログラマーたちによって開発が始まり、現在では、日本を含む世界各国で使われています。
スクリーンリーダーの性能が高くなるにつれて、文字情報だけでなく、代替テキストやOCRなどを利用し、画像に含まれる情報を確認できる場面も増えてきました。
技術の進歩は、こんなにもすごいものなのかと改めて感じます。
これは、スクリーンリーダーの進化だけによるものではありません。Visual Studioをはじめとするソフトウェアの開発側が、アクセシビリティの向上に力を入れるようになったことも、大きな理由だと思います。

ぼくのプログラミング学習方法
最初の一歩
C#の学習は、参考書を探すことから始めました。
点字化された本やテキストデータ化された本は、インターネット上の図書館である「サピエ図書館」などを検索することで見つけられました。『なるほどなっとくC#入門』や『独習C#』など、定番の本も入手できることが分かりました。
まずは本を最初から読みながら、Visual Studio 2019を使って、実際にコードを書いていきました。本を読むだけでなく、コードを入力して動かすことで、少しずつプログラミングの経験を積んでいったのです。
本を読みながらインターネットでも調べることで、盲ろう者であるぼくも、プログラミングの基本を一通り学ぶことができたと思います。
さまざまな情報を活用して学んでいくうちに、
「もっと詳しく知りたい」
「もっと高機能なソフトを作りたい」
という欲も出てきました。
しかし、実際に手を動かしてプログラミングに取り組むと、最初はどうしてもつまずきます。次々にエラーが発生し、エラーの海に溺れてしまいそうになることもあります。
エラーはプログラミングには付きものですが、初心者にとってはパニックの連続です。
そこで考えたのが、
「誰か、直接相談できるプログラマーはいないだろうか」
ということでした。
インターネットで調べると、オンラインで指導を受けられるサービスやプログラミングスクールが、いくつもあることを知りました。
最終的には、以前、システムエンジニア関係の仕事を手伝ってもらったことのある技術者に相談しました。メールでのやり取りを中心としたマンツーマンレッスンを受けながら、何冊かの参考書を学習のお供にして、少しずつ勉強を進めていきました。
それ以来、約5年。プログラミングの奥深さを知り、今では趣味の一つになっています。

学びながらアプリを作ってみる

コンソールプログラミングについて学ぶ
まずは、プログラミングの入り口となる、
「コンソール画面に文字を表示してみよう」
というところから始めました。
コンソールとは、文字による命令や結果を表示する画面です。Windowsのコマンドプロンプトなどが、その一例です。
Visual Studioのエディターに、次の2行を記述します。
Console.WriteLine("Hello everybody");

Console.ReadLine();
実行すると、コンソール画面に「Hello everybody」と表示されます。
コンソールプログラミングでは、画像や画面上のレイアウトを気にする必要がありません。そのため、視覚障害者や盲ろう者にとって、比較的取り組みやすい学習方法だと思います。

Windows Formsプログラミング
Windowsパソコンで一般的な画面を持つアプリを作る方法の一つに、Windows Formsがあります。
Windows Formsでは、文字を入力するテキストボックス、操作のためのボタン、説明を表示するラベルなど、画面を構成するさまざまな部品を配置します。
Visual Studioには、これらの部品をマウスで配置するための「デザイナー」があります。しかし、画面を目で確認できない視覚障害者や盲ろう者にとって、デザイナーを使ったレイアウト作業はハードルが高いものです。
それでも、画面上の位置をX座標とY座標で指定する考え方を応用すれば、コードを使って部品を配置することもできます。
自力でWindows Formsアプリを作ることは可能ですが、覚えなければならないことはたくさんあります。

これまでに学んだ知識を生かしてクイズゲームに挑戦
一つの作品を仕上げるまでには、かなりの時間がかかります。
少し作っては壊し、また作り直す。その繰り返しです。
今回、試しに作ってみたクイズゲームを紹介します。
このアプリを起動すると、最初にカテゴリーの一覧が表示されます。「一般教養」「福祉関係」「数学」などのカテゴリーを用意しました。
カテゴリーを一つ選択すると、それに関連したクイズが出題されます。解答は、4つの選択肢から番号を選びます。不正解だった場合には、正解と、その答えに関する解説が表示されます。
クイズの問題は後から追加できます。内容を少しずつ充実させながら、楽しくプログラミングを続けられるところが、このゲームを作る魅力だと思います。

オブジェクト指向プログラミング
C#は、オブジェクト指向という考え方を採用しているプログラミング言語です。
オブジェクト指向では、家や車など、実際に存在する「物」をイメージするように、データと処理を一つのまとまりとして考えます。
例えば、クイズゲームでは、問題文、選択肢、正解、解説などを「一つのクイズを表すデータ」としてまとめることができます。
このようなまとまりの設計図となるものを「クラス」と呼びます。

コードの一部を紹介
次のコードは、クイズゲームの「Form1.cs」というファイルにある、Form1クラスの冒頭部分から抜粋したものです。主に、変数の宣言と初期化を行っています。
List<Quiz> allQuizzes = new List<Quiz>(); List<Quiz> quizzes = new List<Quiz>(); Quiz currentQuiz; Random rand = new Random(); int score = 0; int totalScore = 0; int totalQuestions = 0; int categoryQuestions = 0; int fishX = 100; int fish2X = 150; int fish3X = 200; int fishY = 100; bool jumping = false; int jumpPower = 0;

コードの意味
役割ごとに分けて説明します。
1.クイズデータと乱数の準備
List<Quiz> allQuizzes = new List<Quiz>();
すべてのクイズデータをまとめて保存するためのリストを作成します。
List<Quiz> quizzes = new List<Quiz>();
選択されたカテゴリーなど、現在の出題に使用するクイズデータを保存するためのリストを作成します。
Quiz currentQuiz;
現在、画面に表示されている1問分のクイズを保存するための変数です。
Random rand = new Random();
クイズをランダムに選んで出題するための乱数生成器を用意します。
2.スコアと問題数の管理
int score = 0;
現在のスコアを0で初期化します。
int totalScore = 0;
すべてのカテゴリーを通じた合計スコアを0で初期化します。
int totalQuestions = 0;
出題した問題の合計数を0で初期化します。
int categoryQuestions = 0;
選択したカテゴリー内で出題した問題数を0で初期化します。
3.魚の位置とジャンプ動作の制御
int fishX = 100;
int fish2X = 150;
int fish3X = 200;
画面に表示する3匹の魚について、それぞれの横方向の位置を設定します。
int fishY = 100;
魚のY座標、つまり縦方向の位置を設定します。
bool jumping = false;
魚がジャンプ中かどうかを記録する変数です。trueならジャンプ中、falseならジャンプしていない状態を表します。
int jumpPower = 0;
ジャンプの勢いや高さに関係する、Y方向の移動量を保存する変数です。

プログラムで使用しているメソッド
プログラミングでは、特定の処理をひとまとまりにし、必要なときに呼び出して再利用できるようにします。この処理のまとまりは、C#では一般的に「メソッド」と呼ばれます。
今回紹介したプログラムでは、Form1.csの中で、例えば次のようなメソッドを使用しています。
void ShowMenu() void StartCategory(string category) void LoadQuizFromCsv() void CheckAnswer(int choiceIndex)
それぞれ、次のような処理を担当しています。
ShowMenu():カテゴリーの選択メニューを表示する
StartCategory(string category):選択されたカテゴリーのクイズを開始する
LoadQuizFromCsv():CSVファイルからクイズデータを読み込む
CheckAnswer(int choiceIndex):選択された答えが正しいかどうかを判定する
このように処理を分けることで、プログラムの内容が整理され、修正や機能追加もしやすくなります。

作製したQuizGameプログラムはこちらからダウンロードできます:https://drive.google.com/file/d/1pNnDs_bitYj-Wd3PktianM-SkeZgj2xM/view?usp=sharing

まとめ
プログラミングは、一見すると、とても高度で難しいものに思えます。
しかし、簡単なコードから少しずつ学んでいけば、視覚障害者や盲ろう者にとっても、一つの趣味になり得ると思います。もちろん、向き不向きはありますが、決して不可能なものではありません。
スクリーンリーダーは進化を続けています。また、ソフトウェアを開発する側でも、アクセシビリティに配慮する取り組みが広がってきました。
視覚を使わなければ難しい作業は、現在も残されています。それでも、使える機能や学習方法を組み合わせ、必要に応じて周囲の助けを借りることで、盲ろう者にもプログラムを作ることができます。
パソコンを使ったプログラミングは、自分のアイデアを形にできる、楽しく奥深い余暇活動の一つになるのではないでしょうか。

コメント