マイ・ガラパゴス・変数名ルール (すごくどうでもいい話)

 私は普段ぼんやりと、あまり他人と会話することなく生きているので、たまに年齢の近いクライアントさんなどとお話しているとき、「役職定年」とか「企業人としての残りの人生を…」などという発言を耳にし、息を吞むような感じになることがある。俺は先のことをなんにも考えてないなあ、と痛感する。

 柄にもなく反省し、これからやってみたいことを頭のなかに書き出してみると、これがすごくたくさんある。まず数学を勉強したいですね。私が高校生の頃、授業はGHQの指導により数学Iまでだったんです(すいません冗談です)。英語ももう一度本腰をいれて勉強したいし、中国語もやりたい。仕事の都合でデータ解析とか調査法とか消費者行動論の論文を読むことが多いんだけど、それはそれで面白いので可能な限り続けたい。積読の本の山の大きさはもう一生本屋に行かなくていいくらいだし、映画も観たい。音楽も聴きたい。これまであまり行かなかったが観光にだって行きたい。趣味のジョギング鑑賞の時間も確保したい。ジョギング鑑賞とは、公園のベンチに座ってジョギングする人々を鑑賞するという高雅な趣味である。足長いなあとか、胸が揺れているなあとか、いろいろな着眼点があり奥が深い。いずれ広く普及し、創設者である私の銅像が行きつけの公園に立つはずである。

 むしろ、これからやりたくないことを挙げたほうが早いかもしれない。トライアスロン、サーフィン、違法薬物… など、これまでやったことのないことを除外し、あれこれ考えて思いついたのが、プログラミングである。これからの人生、プログラミングにはあまり時間を割きたくない。特に、新しい処理系について学ぶのは極力避けたい。えーと、Juliaにはちょっと心惹かれるんだけど、それは横に置いておいて、基本的にはRとPythonだけで済ませたいものだ。
 そうそう、プログラミング・スタイルも変えたくない。私がコードを書くのはアドホックなデータ分析のためで、誰かにコードを渡すことはあっても、他人と共同的にコードを書く機会はごくまれである。そのせいもあって、私は自分だけの特殊なコーディング・ルールを遵守してコードを書くのが習慣になっている。良くないなあとは思うけれど、もう20年ほど続いている習慣だし、なかなか変えられなかったのである。
 よし!これはあきらめよう。私は今後も自分だけのガラパゴス・コーディング・ルールでコードを書くぞ。

 というわけで、記念のため、私による私のための私のコーディング・ルールのうち、特に変数の命名規則に関わる部分についてメモしておく。
 この命名規則は、いまをさかのぼること三千年前(適当)、FORTRAN77とsed+awkからVisual Basic 4に乗り換えた際に考案し、その後のPerl+SASライフを通じて熟成させてきたルールである。これを遵守することによって、人はつまらないミスから解放され、より深刻なミスによって人生を失うことになるであろう。
 以下はマイ変数命名規則(Rバージョン)である。pythonバージョンというのもあるんですけど、だいたい同じです。

 原則は次の通り。
 ハンガリアン記法を採用する。つまり、その変数の意味や目的に従って小文字の接頭辞をつける。そのあとは英数字のキャメル・ケース。たとえば年齢を表す変数は nAge, 出生率を表す変数は gBirthRate、という感じで書く。記号は極力使わない。
 当然のことながら、変数名はわかりやすいものにすること。nVar1, nVar2などという命名は有罪とみなされる。

 一般的な接頭辞は以下のとおり。

  • n: 整数スカラー
  • g: 実数スカラー
  • b: 二値スカラー
  • s: 文字列スカラー
  • d: 日付スカラー
  • an, ag, ab, as, ad: ベクトル(整数, 実数, 二値, 文字列, 日付)
  • mn, mg, mb, ms, md: 行列(整数, 実数, 二値, 文字列, 日付)
  • df: データフレーム
  • l: リスト
  • o: それ以外、ベクトルでも行列でもリストでもないなにかのオブジェクト

 場合によっては、そのプロジェクト限定で新たな接頭辞を追加することもある。時間を表す接頭辞 t とか。
 ポイントは、これらの接頭辞はお気持ちの表明であってシステム上の型じゃない、という点である。今俺これ整数だと思って書いているよ、というのを接頭辞で表現するのである。だから、変数 nAge の変数型がnumericであっても全然かまわない。こういうのをアプリケーション・ハンガリアン記法というのだそうだ。
 今では誰も使わない、実に古くさいやりかただろう。しかし、信じてもらえないかもしれないけれど、私がかつて読んだMicrosoft社謹製のプログラミングの教科書には、仮におまえたちが理性のひとかけらでも持ち合わせているならば、ハンガリアン記法を使えいますぐ使え、って書いてあったんです。本当です。
 さらに弁護させていただくと、こういう書き方にもそれなりのメリットがある。データ解析のための前処理におけるバグのうち、「変数に意外な値が入っている」系のバグはかなりの部分を占めるはずだ。コードをデバッグするとき、n から始まる変数に実数が入っていないこと、b から始まる変数に{0, 1, TRUE, FALSE}以外のなにかが入っていないこと、m から始まる変数が行列であること、などなどを確認するだけで問題を解決できることがある。つまり、デバッグ作業の一部において集中力が不要になる。
 さらにですね。自分が書いたコードを読み返すとき、コードを書いていた時の気持ちを思い出せると話が早い。そのためには、きちんと整理されたコードを書くこと、十分なコメントをつけること、変数名を分かりやすくつけておくことが大事なのだが、たとえば「俺はこの変数が二値だと思っています」ということを明示的にコメントしたり、変数名で表現したりするのはなかなか大変である。接頭辞ひとつでその手間が省けるのだから安いものだ。
 少なくともデータ分析の前処理をしたい人にとっては、便利だと思うんだけどなあ。ハンガリアン記法、なぜみんな使わないんだろう…

 さて、コードはできるかぎり関数として書き、裸のコードは書かない。ワークスペース上にグローバルなオブジェクトを作るのも極力避ける。
 グローバルなオブジェクトを作ったら、それを表す接頭辞をつける。なにかその仕事を表す英文字1字を決めておく(プロジェクト名の最初の文字とか)。たとえばそれが s ならば、グローバル変数には接頭辞 s. をつける。
 たとえば、ローデータを加工して新たなデータをつくるとしよう。ローデータのデータフレームを、s.dfRawdata という名前でグローバル環境に置く。それを受け取って新たなデータを作成する関数をつくる。その関数をコールし、返し値を s.dfData とする。
 関数のなかでグローバル環境に触るのは厳禁である。従って、s. から始まる変数名は関数のなかには登場しない。

 実は、私の書いたコードをなにかの事情で受け取った方が、こうした奇妙なルールについて奇異の念を抱き、お問い合わせ下さることもある。同僚とか、クライアントさんとか。申し訳ありません。仮に他の方に見せるのが前提であれば、こういう書き方は避けて書きます… そのはずです。

 特に説明しにくいのは以下の2点である。

  • 百歩譲ってアプリケーション・ハンガリアン記法を認めるとして、なぜベクトルはaで始まるのか?
     えーとですね、SASという言語をご存じでしょうか。この言語にはベクトルという概念がありません。その代わり、複数の変数について繰り返し処理をするために、既存の変数についてアレイというのを定義できるのです(Rでいうarrayとは異なる)。その名残でございます。いまでも私はベクトルを扱う際、心のなかで「アレイ…」と呟くことがある。
  • 百歩譲って「グローバルなオブジェクトを極力作らない」というルールを認めるとして、なぜグローバルなオブジェクトには s. というような奇妙な接頭辞をつけるのか?
     えーとですね、SASという言語をご存じでしょうか。SAS言語はメインフレーム以来の長い歴史を持っており、ファイルシステムについても独自の概念を持っていました。SASの世界では、x という名前のデータセットは一時的なもので、ディスクへの保存が保証されませんが、y.x という名前のデータセットは永続的なもので、OSのファイルシステム上の y と定義された場所に保存されるのです。私としましてはですね、関数の実行が終わっても消えないグローバルなオブジェクトには、なにかこう、永続的な雰囲気を持つ名前を持っていてほしいのです。変数名がピリオドでふたつに区切られているのって、なにかこう、永続的な雰囲気がしませんか?

 こうしてみると、いかに私がSASユーザとしての経験に縛られているかということがよくわかる。もう何年も触ってないけれど。SAS美 (←擬人化)… お前は居丈高で、不親切で、金のかかる、しかし魅力的な奴だった。