知的好奇心は、それ自体に存在意義があるものだ。

思考停止になっていませんか?

例えばvar a1 = new Array(1, 2, 3, 4 , 5);と言う配列があったとします。
ここで、この配列は添え字でアクセスするので先頭要素はconsole.log(ai[0]);となります。
ところで添え字って言うのは配列の要素数が\(m\)の時に\(n (n < m)\)番目の要素にアクセスするためのものですよね。
この\(n\)番目という使い方をする数を順序数と呼びます。
さて、ここで質問です。


日常生活で、順序や順番を数える時に\(0\)から数え始める人は挙手してください(笑)


いないですよね(笑)私も最初は\(1\)から順番に数を数えていきます。
それにも関わらず、プログラミング言語では\(0\)から始まる事に何の疑問や違和感を持たないのでしょうか?
ちなみに、私が初めて職業として使ったプログラミング言語はCOBOLだったのですが、COBOLの配列の先頭要素は\(1\)でした。同時期に使われていたFORTRANも同様です。
ですから先頭要素が\(0\)のプログラミング言語に最初に接した時は疑問でした。理由は簡単で

  • 日常生活とは乖離している
  • 今までのプログラミング言語とは異なる根拠が判らない

の二点だけです。

では、何をした?

まずは、言語仕様書を調べました。ですが残念ながら\(0\)から始める根拠は見つかりませんでした。
次に、配列と言うのは数学で言う集合論に合致しますので集合論を調べました。
そこで、私が知らなかった衝撃の事実に出会いました。集合論や論理学では自然数\(\mathbb{N}\)は\(0\)から始まるなんて知りませんでした。更に、そもそも数の体系として自然数に使い分けがある事自体が衝撃でした。整数\(\mathbb{Z}\)は自然数を拡張して出来た数です。そして整数を拡張して実数\(mathbb{R}\)や有理数\(\mathbb{Q}\)等が考案されていって現在の複素数\(\mathbb{C}\)まで拡張されてきました。

ですから、まず整数の歴史を遡りました。それは整数は自然数を拡張したものですが、その定義は

\(0\)と、それに\(1\)ずつ加えていって得られる自然数(\(1, 2, 3, 4, \cdots\))および自然数\(n\)に対して加法の逆元である\(-n\)を導入した数

だからです。ここで重要なのは\(0\)と、それに\(1\)ずつ加えていって得られる自然数(\(1, 2, 3, 4, \cdots\))の部分です。つまり、この定義で自然数と\(0\)は別な存在として扱われています。

ここら辺で止めます

実際はこの後も更に深く探求しました。ペアノの公理とか集合論とか、色々と数学や情報科学や情報処理とか、調べまくりました。
どれだけ続けたか覚えていませんが、エドガー・ダイクストラ先生のWhy numbering should start at zeroを読んでプログラミング言語において配列の要素が\(0\)から始めるべき妥当性に出会うまで続けていました。

何が言いたいかというと…

世の中を見渡せばなぜ?と思うことはものは沢山あります。もちろん、IT業界でも。
それらを、だってそう言うものなんでしょ?とか誰かがそう言っていたからでやり過ごしていると、いつか困ります。

  • なぜ1日は24時間?
  • どうして1時間は60分で1分は60秒?
  • どうして1年は12ヶ月?

のような疑問を常に持ち、自分で調べましょうと言いたいわけです。
「誰かに教えてもらった」ではいけないのです。だってその教えてくれた人が本質を正しく理解しているか判断できないですよね?
まずは原点を調べましょう。いわゆる公式マニュアルとか言語仕様書とか、数学だったら定理とか公理とか。

Information is not knowledge.

これはアルベルト・アインシュタイン博士の名言の一つです。日本語にすると「情報は知識にあらず」となるかな?
どういう意味かは調べてみてください。

学ぶ事の大切さと楽しさを知って欲しい

自分が知らなかった事を理解して得る知識は一生ものです。知識と知識を組み合わせて生まれる知恵は宝です。
「そう決まっているから。」では無くて「なぜそう決まったのか?」を大事にして欲しいのです。

聖書から

知恵のある者の舌は知識をよく用い、愚かな者の口は愚かさを吐き出す。

箴言 15章2節(聖書 新改訳©2003新日本聖書刊行会)