SSブログ

マルチスレッドプログラミングにおける重要な4要件 [プログラマー現役続行]

JaSST Tokyo 2018の招待講演で話した資料(こちら)に書いてあることですが、今までの人生で私自身は、デジタル複合機コントローラソフトウェア開発を4回もアーキテクチャを変えて行いました。デジタル複合機の難しさは、ハードウェアからの非同期なさまざまなイベントとユーザからの様々なイベントを両方を上手く処理しなければならず、かなり複雑なソフトウェアとなります。

ソフトウェアエンジニアとして合計すると10年以上をデジタル複合機コントローラソフトウェアの開発に従事し、マルチスレッドプログラミングを行ったことになります。公開資料に詳細情報は含まれていませんが、資料にある「Take 3」と「Take 4」は、デジタル複合機コントローラソフトウェアを完全にテスト駆動開発で行うというものでした。

4回ともマルチスレッドプログラミング(厳密には、Take 4はマルチゴルーチン(goroutine)プログラミング)を行った経験から言えるのは、次の4要件です(JaSSTの公開資料に含まれています)(書かれていませんが、テスト設計も非常に重要です)。

20180308 JaSST2018Tokyo(V4).001.jpeg

この4項目がきちんと行われいるソフトウェア開発はかなり少ないと思います。最初の項目のハードルが非常に高いからです(二つ目も、かなりハードルが高いですが)。つまり、以下のことができません。
マルチコアおよびマルチスレッドプログラミングのきちんとした経験および知識を持つ人が設計やコードをレビューしていること
ある程度(手作業であっても)動作が確認されたプログラムでも、ソースコードを見ると間違っていることがあります。マルチスレッドプログラミングが厄介なのは、その間違いが原因で不具合が現象として現れる可能性が非常に低い場合があることです。

上記の項目3に書かれているように膨大な長時間ランニングテストを数十台のPCで行っていたにもかかわらず、微妙な間違いが入ってから、3か月後に1台のPCだけでその間違いが原因で止まることを経験したことがあります。朝出社したら私のPCでテストが止まっていたので、数時間かけて若手と二人でデバッグしてその間違いに気付きました。しかし、その間違いはソースコードレビューだけではおそらく気付かないようなものでした。そして、その間違いの修正が入ったのがいつかを調べたら3か月前だったのです。

コメント(0)