ちょっとだけ、今のソフトウェア開発について思っていることを書きます。(興味ない方、専門的すぎてわかんない方はすみませんがそっと閉じてくださいm(_ _)m)
これからのソフトウェア開発はまちがいなく並行プログラミング、並列プログラミングが大事になってきます。…って業界によっては今さら何言ってんだこいつってことになりかねないですけど。でも、ぶっちゃけ私が属している組込みという業界はパソコンやスマホがすでにマルチコアへ進んでいるのに比べてまだシングルコアが大多数ですし、何よりソフトウェア開発をしている人たちが逐次プログラミングしか頭にない人たちばっかりです。しかし、いずれは組込み業界にもマルチコアの流れはやってきます(って5年前からいってますけど意外と遅いね)。このハードウェアの大きな変化とそれについていけない技術者とのギャップは克服しなければならない大きな課題となると思います。
私は大学生の時に「マルチプロセッサ向け組込みOS」っていうそれっぽい研究をしていたので、「マルチプロセッサのプログラミングって何なの?」みたいなことをよく聞かれます。私はそういう質問には(面倒くさいので)「いや、普通のマルチスレッドプログラミングですよ」と答えています。この回答は自分は間違っていないと思っています。本当に普通にマルチスレッドプログラミングを作っていただければ問題など起こらないはずです。要するに、うちらの業界ってちゃんと『マルチスレッド』が扱えていないのです。
実は組込み業界ではシングルコアの時代から『プリエンプティブなマルチスレッドプログラム』で動いてきました。組込みの世界はI/Oが頻繁に発生し、その度に動作を止めて待っていたらレスポンスが悪くってたまらないからです。μITRONというOSで実現されていて、日本が誇る組込み開発を謳歌していたのですけれど、そういった技術は次世代にうまく受け継がれなかったらしく、OSがLinuxへと変わっていったあたりから動作が重いわ、バグは垂れ流すわといった体たらくを見せています。どうしてこうなったヽ(´ー`)ノ
正直な話、マルチスレッドプログラミングは難しいです。マルチスレッドの難しさをざっくり2つに集約してみます。
- 不具合がスレッドの実行順序に依存するために再現性が低い
- スレッドをたくさん作れば性能が向上するとは限らない
前者は本当に現場を悩ます大問題で、ある日客先で発生した不具合を再現しようとしてもこちらでは何回やっても出ない、なんてことがいっぱいあります。また、試験に関しても重大な課題を突きつけます。形式的に完全にマルチスレッドで動作を保証するためにはスレッドが実行するアトミックな命令の全ての実行順序の重ねあわせ(インタリーブ)に対して仕様通りに動くことを確認しなくてはなりませんが、これは天文学的数値です。製品は100万年たっても出なくなります。現実的には合理的にテストケースを絞り込む必要があります。絞り込むためにはソフトウェアの設計者や試験の設計者が、マルチスレッドに対して深い理解をしていることが必要です。
後者の問題はマルチスレッドプログラミングに対するもっとも典型的な勘違いです。マルチスレッドや並列プログラミングは素晴らしいものだから、たくさんスレッドを作ってどんどん並列化すればどんどん性能が改善するという純粋無垢な設計者がプロジェクトを担当すれば、たちまちプロジェクトは不具合と性能の低下に見舞われてしまうでしょう。そういう設計者には世のプログラムには並列化できないものが存在することと、性能向上にはアムダールの法則というものが存在するということを教えてあげる必要があります。
さらには
- スレッドはOSによって実現されていてそこには必ずオーバヘッドが存在すること
- 性能(いわゆるスループット)向上だけでなくタスクの優先度、応答時間を考慮することが必要なこと
も理解しなければなりません。これらが理解できない技術者はマルチスレッドを設計すべきではないでしょう。
私はこの問題を克服するためには教育しか無いと思っています。大学の情報系の学科ではマルチスレッドプログラミングを必修にして欲しいです。いや、マジで。MATLABやJavascriptでなんかプログラム書いてきました→じゃあプログラミングできるね→マルチスレッドやって→なんすかそれ?みたいな事例を大量生産するのはもうやめていただきたい(涙)第1段階でマルチスレッドに対する様々な問題を体験していただいて、さらにはそれらを解決するための原理や設計手法を理解してもらう。そんな教育課程があってもいいのではないでしょうか。大学でダメならせめて会社の新人研修とか、中堅向け講座でもいいですから…。
じゃあ自分はどうなんだって話なんですけど、業界で働いている平均から比べたら、大分ましなつもりです(キリッ)しかしながら並列プログラミングの全てを理解している自信は全く持てないので、これからもっと勉強していこうと考えています。
具体的にはThe Art of Multiprocessor Programmingという本を読んで理解を深めていきます。
The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで 新品価格 |
D.Knuth先生のThe Art of Computer Programmingをもじった感じの名前ですね。日本語版の出版が2009年でオリジナルが2008年ですから私が会社に入社してから出た本です。プログラムはJavaで書かれています。もう、序盤から頭いてーって感じですけどステキな未来が来ると信じて頑張って読み込んでいきます。
他にもオライリー本の『並行コンピューティング技法』っていう本も読んでみました。
並行コンピューティング技法 —実践マルチコア/マルチスレッドプログラミング 新品価格 |
こちらの方がページ数も少なくて読みやすかったですけど、実践例が文字列処理とか、ソートとかグラフ探索とかどちらかと言うとWebサーバーがやるようなプログラミングで組込みではあまり使わないので引き出しとして取っておきます。
投資ブログにこんなこと書いて何の意味もなさそうですけどw私のつぶやきを最後までお付き合いいただきありがとうございました(;_;)