昨日はRustに乗り換える計画について書いた。そんなに書くことないかなと思っていたのだけど、書き始めると意外と指が動いてそこそこの文量を確保することができた。もう今の段階で書けることは書き切った感がある。それでももう一度書いてみることにしてみようと思う。書き始めればなんとか文字を埋めることができるかもしれない。今、オライリーの「プログラミングRust 第2版」を読んでいて、残すところあと2章となった。今日はこの本でおそらく一番難しいところと思われる、並列性と非同期プログラミングの章をなんとか読み切った。記憶が風化しないうちにそれらのことについて書くのが良いのかもしれないけど、さすがに経験不足のため、何も書くことがない。Rustの並行処理のサポートは充実していて、並行プログラミングについて学ぶにも良いプラットフォームになっている。もし、C++で並行プログラミンの経験を十分に積んでいたら、書くことはたくさんあっただろう。何の経験もない自分でも、Rustのマルチスレッドの扱いは、言語の方向性とぴったりと合致して、自然な感じで統合されていることに感動すら覚える。そういう感覚的な、これは良いとか難しいとか感触を確かめることはできたのだが、言語化できるほどは体得できていないので書くことができない。具体的にどういうケースでマルチスレッドを採用したほうがいいとか、非同期処理にしたほうがいいとか、そういうのがない。
並行プログラミングは自分の中でボトルネックとなっている部分でもあると思っている。こいつをなんとかしないとこれ以上先に進めないのではないかとすら思っている。マルチスレッドもごく小さな範囲に閉じ込めて、他のどこにも影響が出ないようにしたような、限られた利用の仕方くらいならなんとか扱えるかもしれない。それだけできれば、現実、なんとかなってしまうようなケースがほとんどという状況にある。もしくは、並行プログラミングなど全く必要ないというケースが大半だ。これで悪循環が生まれる。並行プログラミングができない、したがって、並行プログラミングを扱う開発はできない。しかし、並行プログラミングができなくても達成可能な案件はたくさあるので、そういったものをこなしていけばいい。結果、いつまで立っても経験を積むことはできず、並行プログラミングを身につけることはできないままになる、というサイクルに陥る。この悪循環を断ち切るには、積極的に並行プログラミングを身につけるトレーニングをするしかない。
並行プログラミングのトレーニングが必要なことは分かった。では、具体的にどういうことをすれば良いのだろうか。プログラミングにおいて、わかりやすく、効果も期待できるトレーニング方法は、実際にプログラミングをすることだろう。さらに、実験的なプログラムではなく、ちゃんとした実用性のあるプログラムであればなお良い。実用性のあるプログラムというのはなかなか難しいかもしれない。そんなに大したものを考えなくても良い。他人が使って便利だと思うものでなくても、自身の日々のタスクを効率化してくれるような、小さなものをたくさん作ってみるところから始めるのがいいだろう。実用性というものの解釈を広げて、作って楽しいものとか、遊んで楽しいもの、要はゲームをつくればいい。ゲームには並列化するような要素がたくさんあるのではないだろうかと思う。これまでは、ゲームを作るときに並列化するかどうかなど検討もしなかった。そこを意識的に、どうやったらこれを並行処理させることができるだろうと、考えていくことにする。おそらく、無駄に複雑化して間違った設計になってしまうこともあるだろうけど、そうやっていかないと、最初から可能性を捨ててしまうといつまで立っても並行処理を行うかどうかの判断力もつかないし、プログラミングもできないままになる。例えば、小規模なミニゲームなんかでは、伝統的なシングルスレッドのプログラミングモデルで十分達成可能なことがほとんどだ。並行処理でなければどうしても達成できないことなどあまりないので、意識してやらないと永久に打順は回ってこない。
そういことで、これからしばらく、おそらく来年は並行プログラミングを身につけることを目標にやっていこうと思う。言語はC++からRustに移行することを念頭に置きながらやっていくことになる。これは並行して進めていく計画なので、一種の並行処理といえなくもない。C++の標準ライブラリには並行処理のサポートが含まれている。比較対象として療法を同時にやっていくのも悪くなさそうだ。目標はRustに移行することなので、Rustを基準にしながら、C++のプログラミングも並行していく、これもまた並行処理と言えなくもない。こうしてみると、現実でも、人間の脳も並行に何かを行うができるようになっていて、割と自然に効率良くできるようになっているようにも思える。こじつけだけど。比較対象はC++に限定する必要もないだろう。現代的なプログラミング言語やそのライブラリには何らかの形で並行プログラミングをサポートするツールが提供されている。それらに広く手を出してみることでも、成果は得られそうだ。例えばGo言語にはgoroutineというのが言語に備わっている。以前Goをやっていたときは、その存在を無視していた。もうGoに対する関心は薄れてしまったのだけど、改めてそこに着目して、並行処理に特化して学んでみるのも悪くない。
あと、並行プログラミングのアルゴリズムを学ぶ必要もありそうだ。 アルゴリズムはライブラリが提供するものとして、軽視されがちなところがあるけど、基本的なアルゴリズムを学ぶことによるコーディングスキル上昇値はかなり高い。逆に、重要だけどしばらくは学ばなくても良さそうだと思うのは、OSに近い低レイヤの部分だろう。Linuxカーネルがどうやってスレッドを管理しているかとかは、興味はもちろんあるけど、しばらくは保留しておく。言語とライブラリによって提供される、表面にまずダイブして、徐々に下に潜っていく、トップダウンのアプローチが良さそうだ。
最初は並行プログラミングについて書こうと思っていたわけはなかったのだけど、書き始めたら結構指が動いたので、今回はそのまま続けてしまった。その結果、だいたい今後の方針が固まってきた。来年は並行プログラミングの1年になるようにしよう。