1.はじめに
タイトルを見て、「何?」と思った方もいらっしゃるかもしれませんが、これは筆者が2018年初めに読み直した本から非常に印象に残った一節です。今回はこの一節を紹介させてください。
この言葉は、以前の記事(個人的に役立つ技術本)にて筆者が紹介した、矢沢久雄著/日経ソフトウェア監修『プログラムはなぜ動くのか~知っておきたいプログラムの基礎知識~』 日経BP社から部分的に抜粋したものです。
この一節の詳細を話す前に、本書について少し紹介したいと思います。
プログラムはディスクからメモリにロードされた後、マシン語に変換されCPUによって解釈・実行されるわけですが、本書はその仕組みを詳細に解説した文献です。CPUが単純な構成かつ単純な命令しか実行できない仕組みになっていることから始まり、メモリ、ディスク等、プログラムを動かす個々の構成要素について図やサンプルコードを用いながらわかりやすく説明しています。IT業界に入った新人向けの書籍でもありますし、この業界である程度経験を積んだ方でも読めるものであると思います。
2.OSの存在によっていかに「楽ができるか」
そして本書では、『オペレーティングシステム』(OS)についても触れています。OSのおかげでプログラマがハードウェアのことを意識する必要がなくなることを、幾つか例を使って示していますが、一番直感的でわかりやすいのは文字列をテキストファイルに書き込むアプリケーションの例でしょうか。
本書で登場したソースコード(※1)はこちらです。原文のまま抜粋。
Sub Main()
Open "MyFile.txt" For Output As #1
Print #1, "こんにちは"
Close #1
End Sub
原文には書かれていませんが、Javaだとこのように表せますね(※2)。
public class JavaApplication {
public static void main(String[] args) throws IOException {
Path path = Paths.get("C:\\Users\\Public\\MyFile.txt");
String string = "こんにちは。";
byte[] byteArray = string.getBytes();
System.out.println("◆◆◆ファイルへの書き込みを実行します。◆◆◆" + LocalDateTime.now() );
Files.write(path, byteArray, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
System.out.println("◆◆◆ファイルへの書き込みを終了します。◆◆◆" + LocalDateTime.now());
}
}
テキストファイルに文字列を書き込むということは、ハードウェアとしてのディスクにデータを書き込むことと同じです。本書を引用すると、通常、
ディスク媒体は、バウムクーヘンを切り分けたようなセクターに区切られ、セクター単位でデータを読み書きするものですハードウェアを直接操作するなら、ディスク用のI/Oにセクターの位置を指定してデータを読み書きすることになるでしょう。ところが、
原文のVisual Basicのコードであれ、本稿のJavaのコードであれ、「セクターなどみじんも登場しません。」また、ファイルシステムの仕組み上いきなりディスクにアクセスするわけではなく、確保されたメモリ領域に内容を書き込んでからディスクへ反映する動きをするわけですが、これらのコードには、この一連の動作は一切登場しません。なぜかと言うと、OSがプログラマの代わってハードウェアに対して直接制御してくれるからです。
プログラマにとっては、テキストファイルのパスと書き込みたい内容を与えるだけで(※3)、やりたいことを実現できるわけであり、OSの存在によっていかに「楽ができるか」がわかるかと思います。
3. 「楽をするだけではダメ。・・・」
前置きが長かったかもしれませんが、本稿の本題に移ります。
上述のとおり、この例ではVisual BasicのプログラマもJavaのプログラマも、そして他言語のプログラマでもOSのおかげでハードウェアを直接意識する必要はなくなるわけです。本書では、
プログラマに意識して欲しいのは、ハードウェアではなく、OSの機能を利用するアプリケーションを作成しているということです。・・・(中略)・・・OSによってプログラマがハードウェアを意識しなくて済むようになったので、・・・(中略)・・・「私は文系なのでハードウェアのことはよくわかりません」という人であっても、アプリケーションを作成できます。
とOSによる恩恵を述べている一方で、
ただし、一人前のプログラマになるためには、基本的なハードウェアのことがわかっていて、それがOSによって抽象化されているため、効率的にプログラミングできるという事実を知っておくべきです。そうでないと、何らかのトラブルが遭遇したときに、それを解決するすべが見つからないでしょう。
と警鐘を鳴らしており、最後に
楽をするだけではダメです。なぜ楽ができるかを知ってから、楽をしてください。
と結んでいます。
本書ではOSを例に、詳細を隠蔽する機能があるおかげで「楽ができる」ことを示しているわけですが、筆者も含め多くの人が考えるように、こういったことは何もプログラマから見たOSに限りません。極端な例で言うと、あるシステムの利用者がシステムを使えるのは裏でシステムが動いているからです。もう少し技術寄りな例を挙げると、
- DBユーザがOracle DatabaseへあるSQLを投げる際、通常2回目以降のアクセスで処理が早くなるのは、裏でOracle Databaseのオプティマイザがパフォーマンスが最適化できるよう実行計画を作成しているためです。
- Javaプログラマがトランザクションのコードを明示的に書かなくてもEJBをGlassFish上で動かせば勝手にトランザクションが開始されますが、これは裏でGlassFishがEJBの中身を見て自らのトランザクション機能を動かしているためです。
要するに、重要なのは、(システムの利用者は厳しいかもしれないですが、)DBユーザであれ、プログラマであれ、いろいろな場面で「楽ができ」ているんだということを認識したうえで、詳細なところまではいかないまでも、「なぜ楽ができるか」仕組みをおさえておく努力が必要ではないかということだと思います。そうでないと、上述の例で言えば、DBのパフォーマンスが悪くなった場合に対策が立てられなくなったり、細かくトランザクションを制御したい要件に対応できなくなったりするためです。
そうです。「楽をするだけではダメ」なんです。
#4.終わりに
明示的に記載されているわけではないですが、「なぜ楽ができるか・・・」の裏のメッセージとしては、「なぜ楽ができるか知」らないで楽をしてていたせいで、後でトラブルが発生した場合に原因を解明したり解決策を立てたりするのに非常に苦労する、ということだと推察します。
本書は初版が今から15年以上前に出された本です。技術が発達し様々なIT製品が出てきている今日でもこの言葉は普遍性を持つことは間違いないでしょう(※4)。最初この一節を読んでピンとこなかったけれど、あとで読み直してみて痛感することも多いかと思います。ぜひ本書に目を通してくださればと思います。
脚注
(※1)Visual Basicのコードなのですが、そのままだと筆者のWindows 7環境で動作できませんでした。半日以上費やして原因調査、試行錯誤しましたが情けないことに力尽きてあきらめました。そのため、本稿はJavaソースコードも掲載しその稼働実績も添付した次第です。Javaの事例を載せても本稿の本質に影響するものではないと考えております。
(※2)Javaでのファイルの読み書きはいろいろ方法があるかと思いますが、本稿ではNIO2のAPIを利用しました。なお、本来ならディレクトリやファイルの存在確認とか権限のチェック等をするとよいのかもしれませんが、単純化のため省略しました。
(※3)正確に言うと、Visual Basicの場合、もう1つ「ファイル管理番号」が必要になります。本書によると、OSが確保したメモリ領域の管理番号を意味し、1つのアプリケーションが複数のファイルを同時に読み書きする場合には、管理番号が1、2、3、・・・と増える、仕組みになっています。
(※4)この場でもう少し言うと、新製品や新技術が次々と生み出されているこの世界においても、本書で記載されているプログラムが動く仕組みについても、その仕組みを根底から覆すような技術でも現れない限り、間違いなく普遍性を持つと言えるでしょう。