LoginSignup
395
328

[雑学]エンジニアのネーミングセンス

Last updated at Posted at 2021-05-01

Qiitaが「プログラマーにとって……」から「エンジニアにとって……」になったことを記念(?)して、駄文を作成しました。
コンピューティング関連のちょっと変わったネーミングをメモして、古今東西のエンジニアのネーミングセンスを鑑賞(?)してみます。

特にまとめとか、オチとかはありません。ダラダラ書いていきます。

(2021-05-01から規約/ガイドライン変更かと思っていたけど、よく見たら 2021-04-30 からだった。平日(営業日)に切り替えたってことなのかな? ということは4/30はQiitaの中の人は出社だったのでしょうか、お疲れ様です)

ちなみに

これは、GW に書いた駄文3本のうちの1本です。気が向いたらほかの物も読んでみてください。

メニューボタン

UI のメニューボタンは、食べ物のメニューを連想させる名前がついているみたいです。

名前 説明
ハンバーガーメニュー(hamburger menu) ご存じ、三本線 🍔
ミートボールメニュー(meatballs menu) 横3つの点
ケバブメニュー(kebab menu) 縦3つの点(串焼き) 🍢 シシカバブ(シシケバブ)ですね
ベントーメニュー(bento menu) 3x3の四角(お弁当のこと。雰囲気から松花堂弁当?) 🍱
ドネルメニュー(doner memu) だんだん短くなっていく三本線。日本だとこっちをケバブ(ドネルケバブ)と呼びそうな。というかあまりこのようなメニューボタンは見ない気がしますが、主にフィルター機能用のメニューなのかな?

image.png

ちなみに、「おでん」の絵文字🍢は外国ではケバブ(串焼き)と呼ばれることもあるみたい。外国に「おでん」ないから意味わからないですよね。関係ない話ですが

(このメニューのネーミングは本当なのか、あるいは上記ツイートがジョークなのか、よくわからないですね。少なくとも「ダブルハンバーガーメニュー」はジョークだと思いますが)

このほか、UI周り、Web周りには他にも食べ物系の名前が多数(例えばクッキー、パンくずリスト、トースト、スナックバーなど)ありますので、フロントエンジニアさんはおなかがすくんじゃないかと思います。

ちなみにドネルケバブってこれ(↓)ね

識別子の表記法

名前 説明
キャメルケース(camelCase) 単語の先頭を大文字にして結合。識別子の先頭は小文字。
(lowerCamelCase という場合もあり)
名前の由来は大文字小文字がラクダのこぶのようにみえるから 🐪 🐫
パスカルケース(PascalCase) キャメルケースと同じだが、識別子の先頭も大文字 。
(UpperCamelCase という場合もあり)
由来は Pascal 言語でよく使われる形式だから
スネークケース(snake_case) 単語をアンダースコアでつなぐ。普通は小文字で書く。
(特に lower_snake_case ということもある)
由来は形状が蛇っぽいから 🐍
スクリーミングスネークケース(SCREAMING_SNAKE_CASE) snake_case をすべて大文字にしたもの。絶叫する蛇記法? 英語話者からするとすべて大文字の単語は叫んでいるように感じられるようですね。
(UPPER_SNAKE_CASE、CONSTANT_CASE と呼ぶ場合もあり。C 言語や Java 等では定数名の記法として使われることから)
ケバブケース(kebab-case) 単語をハイフンでつなぐ。由来は串焼きっぽい形状から。🍢 ケバブ、人気だな。
(chain-case / spinal-case と呼ぶ場合もあり。鎖あるいは骨でつないだイメージ?)
ドットケース(dot.case) 単語をピリオドでつなぐ。普通は小文字で書く。が、場合によっては単語の代わりにキャメルケースやスネークケースをさらにドットでつなぐこともある(お作法的には良くないのかな?)

ヨーダ記法

if 文などの条件式を書く場所で 変数 == 定数 ではなく 定数 == 変数 と書く記法。
(この例での == は等しいを表す比較演算子)

C 言語の言語仕様では真偽値の型はなく、数値は 0 が偽、0 以外が真となり、また式の中で代入も可能なため、以下のように書いてもコンパイルエラーとならない。

int c = func();
if (c = 0) { /* エラーにならない */
    /* 何らかの処理 */
}

こういったバグを避けるために、定数を左側に書く記法が使われることがあった(定数に代入できないからコンパイルエラーになる)。

int c = func();
if (0 = c) { /** コンパイルエラー */
    /* 何らかの処理 */
}

またその習慣を他の言語に持ち込んでいるプログラマーもいるようです。
名前の由来は、スター・ウォーズの登場人物「ヨーダ」が、標準的な英語の文法ではない語順で話すことから。

ただしいくつかの言語では、条件式には真偽値しか書けなくなっているため(あるいは代入ができないようになっているため)、このような記法で書く必要は(ほぼ)ない。

int c = method();
if (c = 0) { // コンパイルエラー
    // 何らかの処理
}

ただし、真偽式の場合には間違えて代入を書いても、エラーにならないというケースもある。

boolean flag = false;
if (flag = true) { // コンパイルエラーにならない
    // true の場合
} else {
    // false の場合
}

真偽値の判定の場合には、 == を使わない方が良いといわれる理由の一つ。

boolean flag = false;
if (flag) {
    // true の場合
} else {
    // false の場合
}

最近は、言語仕様のほか、IDEやエディタなどが賢いので、このようなエラーは事前に取り除けることもあり、ヨーダ記法は使わない方が良いという風潮らしい。

(また、ヨーダ記法で書こうとしても、変数同士の比較はどうするんだ、という話もある。わざわざ 変数1 + 0 == 変数2 のように左辺値にならないように毎回書くのもナンセンスだよね)

ハンガリアン記法

変数名の先頭(あるいは末尾)に、変数名の情報をわかるようにつける記法。

考案者チャールズ・シモニーがハンガリー出身であることに由来するみたい。

……名前の付け方が雑だな、と思う。
この名前では、ハンガリーでは一般的にこのような使い方をするみたいに聞こえるよね?

昔、マイクロソフトの標準的なネーミングルールになっていた(とおもう)ので、広く使われていたが、最近ではあまり使われていないみたい。

ただし、マイクロソフトのネーミングルールでは、先頭につけるのは型情報になっていたため、あまり意味がなかったのではないかと思います(これをシステムハンガリアン記法と呼ぶらしい)。

上記 wikipedia にも書いてある通り、シモニーさんが考案していたのは、型情報が同じでも異なるデータ、例えば、摂氏と華氏など、あるいはドルと円など、どちらも数値だけど基本的には別物の変数を区別するための物だったようです(こちらをアプリケーションハンガリアン記法と呼ぶらしい)。

ちなみに、最近(?)のプログラミング業界(?)では、この手の異なる意味の変数は型を分けてより安全にしようという考え方もあります。普通に型を作る場合や、より高度な型レベルでの使い分けなどもあるようです。

……メンバー変数(プロパティ)にはアンダースコアをつける、とかのルールもハンガリアン記法の一種なんだろうか?

あとは、文字列型で受け取って数値に変換してから使うようなケースで、システムハンガリアン記法っぽい変数名になるのが、ちょっともにょっとしますよね。

ポーランド記法/逆ポーランド記法

普通の数式などで使う演算子は、値と値の間に配置します。 値 + 値
そのため中間記法とも呼びます。

ポーランド記法は、二つの値の前に演算子を置きます。 + 値 値
そのため、前置記法ともいいます。不思議な記法に見えるけど、関数/メソッド呼び出しだと思えば、それほど違和感がないかも。 plus(値, 値) あるいは Lisp とか (f x y)

逆ポーランド記法は、二つの値の後ろに演算子を置きます。 値 値 +
そのため、後置記法ともいいます。スタック処理言語などでよく使われています。
昔の HP の電卓とかも、逆ポーランド記法がつかわれていましたよね(今でも? 使ったことないけど)。

名前の由来は、ポーランド人の論理学者ヤン・ウカシェヴィチが考案したことによるらしい。
名前の付け方、雑だな(以下略)。

このようなネーミングルールだと、アメリカ人が考案したものは、みんな「アメリカンなんとか」になりそう。そうならないのは、マイノリティの悲哀?
数学の中国人剰余定理(中国剰余定理)とかもあるので、必ずしもエンジニアだけのネーミングセンスではないのかも。

マスタッシュ構文

たとえば vue.js などで、テキストを展開する際に使用する構文。二重波括弧でくくる方法ですね。

<span>Hello, {{ message }}</span>

もちろん名前の由来は、二重波括弧が口ひげ(マスタッシュ)みたいに見えるところから。おヒゲ構文。

ダック・タイピング

Smalltalk や Ruby や Python などの動的型付けオブジェクト指向言語での型付け作法、らしいです。

"If it walks like a duck and quacks like a duck, it must be a duck"

「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない」

まったくもって、アヒルである必要がない説明なのに、広く使われていることにビックリ 🦆

英語では、「ダック・テスト」という考え方が元からあったから、のようですが。

wikipedia のダック・テストの説明では「アヒル」じゃなくて「鴨」ですね。

ダック・タイピングが、アヒルなのか鴨なのかはわからんですが。英語では区別がないっぽいですね?

アヒル(家鴨)もマガモ(真鴨)もアイガモ(合鴨)も、ダック・タイピング上は(duck のように歩き、duck のように鳴くので) duck なんでしょうけど。

……そういえばラバーダック・デバッグといった手法もあるし、もしかしたらダックが好きな人が多いだけ、なのかな?

ELF と DWARF

ELF は Executable and Linkable Format の略。
Unix / Linux とかで使われている実行形式ファイルや共有ライブラリのファイル形式

エルフの絵文字なんてあるんだ→ 🧝

対照的に、デバッグ用データフォーマットは DWARF と呼ばれています。
ドワーフの絵文字はないみたい?

デーモン

Unix / Linux のバックグランドサービスのこと。
ちなみに、綴りは daemon。

ロングマン現代英英辞典によると

a creature in ancient Greek stories that is half a god and half a man

「半分は神で半分は人である古代ギリシャの物語の生き物」

とあるので、悪魔/悪霊(demon)とは異なるもの。

バグ

プログラムの意図しない動作、誤り、不具合などのこと。

由来は諸説あるけどよくわかりません。
コンピュータ業界が初ではなく、それ以前のエンジニアリング業界で工業製品での不具合として bug という言葉が使われていたようなので、それの借用なのでしょう。

たまに、「本物の虫が原因で不具合が起きたことがありそれが由来だ」と書いてある記事などを見ることがあります。

そのようなことが起きたのは事実のようですが、その時の日誌が残っており「本物のバグが見つかった最初のケース(First actual case of bug being found.)」と書かれていることから、その時点ではすでに bug という言葉が現在の意味で使われていたことは、確実だと思われます(上記 wikipedia の「バグ」の項にも日誌の画像あり)。

bug の絵文字は嫌がる人もいそうなので、自粛します。

GNU

GNUは "GNU's Not Unix!"(「GNUはUNIXではない」)の再帰的頭字語として有名ですよね。
似たような再帰的頭字語のネーミングの物も多いので、エンジニアの琴線に触れるネーミングセンスなのでしょうね。

個人的には GNU が再帰的頭字語のハシリなのかと思っていますが、もっと前から使われていたのかな。

ちなみに、gnu(アフリカ原産のヌー。和名はウシカモシカ)と同じ表記ですが(そして GNU のロゴもヌーがモデルだと思いますが)、GNUは「グヌー」と発音するようです。

cat コマンド

Unix/Linux 系のコマンド。
一般的にはファイルを表示、あるいは標準出力に出力するもの、という認識だと思うけど、名前の由来は concatenate (連結する)から。

$ cat a.txt b.txt > c.txt

なんで concatenate の途中の3文字を使うのだろうか?
C 言語の文字列連結も strcat() だよね。
concatenate の省略形は cat なのかな?
それとも単に、猫好きなだけ? 🐈 ニャーン

tac コマンド

ところで、テキストファイルを逆順に出力するコマンドがあります。

  • tac コマンドは、ファイル内の行の順番を逆に出力します。
  • rev コマンドは、行の末尾と先頭を逆に出力します。
$ cat a.txt
foo
bar
baz
$ tac a.txt
baz
bar
foo
$ rev a.txt
oof
rab
zab

cat と tac ……。

more コマンドと less コマンド

more コマンドと less コマンドは、どちらもファイルを閲覧するコマンドです。
コンソール画面に表示しきれない場合には、ページ単位で確認しながら表示ができます。

もともとは more コマンドが存在し、それの機能拡張版として less コマンドができたような歴史です。
less の名前の由来は more の反対語からでしょう。

DRY 原則

コンピューティングの世界で、原理原則と呼ばれているものがいくつかあります。
その中の一つに、DRY 原則と言われるものがあります。
Don't Repeat Yourself (繰り返しを避ける)の頭文字であり、無駄な重複や繰り返しを排除すべきというものです。
プログラマの三大美徳の一つ、「怠惰」にも通じる考え方ですね。

ところで、DRY 原則に反しているプログラムは何と呼ぶか知っていますか?
どうやら WET(Write Every Time:必要なものをその都度書く)と呼ぶようです。

DRY (乾いている)と WET (濡れている)……。

形状から命名された演算子

コメントで教えてもらったものを追記。
Ruby の演算子には、その形状(見た目)から名付けられたものがいくつかあるようです。

演算子 名前 説明
=> ロケット演算子(rocket operator) ハッシュのキーとバリューをつなぐ演算子
<=> 宇宙船演算子(spaceship operator) いわゆる comparator のようなもの。比較して負/零/正を返す。由来は『スターウォーズ』のタイ・ファイターが有力。Perl/PHP/MySQL/C++などにも存在するので Ruby だけの専売特許ではありませんが
&. ぼっち演算子(lonely operator) 正式には safe navigation operator なのかな

ぼっち演算子は、一人で体育座りしているんですね。

他にも、いくつかの言語にはエルビス演算子 ?: というものもあります。
意味的には、Null合体演算子、あるいはその類似の機能を表しますが、名前の由来は「エルビス・プレスリーの顔文字に見えるから」というもの。

どんなふうに似ているかわからない人は、Qiita にわかりやすい記事があったのでリンクさせていただきますので、こちらをどうぞ。

(英語圏での伝統的な顔文字は横向きになることが多いです。例: 笑顔は :) になる)

また、python で最近(3.8から)導入された演算子に、セイウチ演算子 := があります。
形が(横向きになると)セイウチに似ているというのが由来のようです。

ちなみに := という演算子そのものは Go 言語でも使われていますが、実はかなり古くから存在するもので、例えば Pascal, PL/I, PL/SQL などでは代入演算子として使用されています( := が代入演算子、 = が比較演算子になる)。おそらく源流は ALGOL じゃないかな。

演算子としての違いは、ALGOL系では単なる代入 ですが、Python では 代入 (式の中でも使える)になる、ということでしょうか。
(広い意味では C 言語も ALGOL 系言語と言われることがありますが、今回の話は BEGINEND でブロックを示すような、狭い意味での ALGOL 系言語ですね)

単なる代入(=)が使えないのは、前述のヨーダ記法のもとになったバグが発生しやすい件についての対策なんでしょうね(C 言語の代入 = は式の中でも使えた)。

Go 言語も少し意味が違って型推論付きの初期値代入という意味になるかと思います。

ちょっと毛色が違いますが、BNF での「定義(導出規則)」としても使われていますね(これも ALGOL の影響だと思います)。

古くからアロー演算子 -> というものもあります。
C言語では、ポインターをたどった先を示すのに、このアロー演算子を使用します。
php などでも同様ですね。

また、演算子というべきかは微妙ですが(言語によって変わる?)、いくつかの言語では lambda 式などを表すのに、このアロー演算子と同じ表現が使われています。例えば Ruby や Java などでは -> で lambda 式を表します。

さらに言えば、別の言語では => で lambda 式(あるいはその類似のもの)を示すものもあります。
例えば C# や JavaScript では => で lambda 式や アロー関数式を作ります(形は、Ruby のロケット演算子と同じ)。

AltJSの一つである CoffeeScript では、 ->=> の両方ともに、意味は違うものアロー関数的に表記します。
CoffeeScript の -> は JavaScript の function での関数定義と同様に this を置き換えます。
CoffeeScript の => は JavaScript の => と同様に this を置き換えないようです。
この時の => はファットアロー(太い矢印)と呼ばれるみたいですね。

php での => は、連想配列のキーとバリューをつなぐのに使うので、Ruby のロケット演算子と同じような意味ですが、一般的にはダブルアロー(二重矢印)と呼ぶようです。

Java7から、ジェネリックでの型を省略するのに <> を使えますが(new ArrayList<String>() の代わりに new ArrayList<>() と書ける)、これはダイヤモンドオペレーター(ダイヤモンド演算子)と呼ばれています。
不等号として != と同じ意味で <> を使える言語もありますが、そちらではあまりダイヤモンド演算子と呼ばれていた記憶はないですが、どうなんでしょうか。

エンディアン

コンビューター界でもいろいろな派閥がありますが、CPUというかバイト配列の派閥(?)に「リトル・エンディアン」と「ビッグ・エンディアン」というものがあります。

実際は派閥を表す言葉というよりは、16 bit (= 2 byte) や 32 bit (= 4 byte)、あるいはさらに大きいビット数の値を、メモリ空間上で、バイト単位でどのように配置するかを表す言葉ですが。

エンディアンは、単にバイト・オーダーとも呼ばれます。
日本語では endian と表記されることが多いですが、正式は英語では endianness のようです。
(このマシンの endianness は little-endian だ、みたいな感じ?)

  • リトル・エンディアン: 0x1234567878 56 34 12 のように配置(小さいアドレスがLSB)
  • ビッグ・エンディアン: 0x1234567812 34 56 78 のように配置(大きいアドレスがLSB)

ちなみに、例えばインテル系の CPU だとリトル・エンディアンで、モトローラや Spark だとビッグ・エンディアンですね。

(実際には、上記2つ以外のバイト・オーダーのマシンも存在します)

名前の由来は「ガリバー旅行記」に出てくる小人の国リリパットで、卵の殻を尖った方から剥くか、太い方からにするかで争っている派閥からとられています。リトル・エンディアン(little-endian)が尖った方で、ビッグ・エンディアン(big-endian)が太い方ですね。

もともと「ガリバー旅行記」には社会や慣習の風刺をしている側面があり、小人の国の争いはつならないことで争っているイギリス政党への批判だ、という説があります。

それをコンピューター界の用語に持ち込んだのは、つまらないことで争うな、という思いがあったのかもしれません(妄想)。

(コメントでネタを提供いただいたので「エンディアン」を追記)

ヌメロニム(numeronym)

長い英単語を、その先頭と末尾のみを残して、間の文字をその文字数に置き換えて省略する記法。
日本語では数略語というようです。

  • i18n - 国際化。Internationalization(アメリカ英語)/ Internationalisation (イギリス英語)の意
  • l10n - 地域化。Localization(アメリカ英語)/Localisation(イギリス英語)の意
  • k8s - Kubernetes (コンテナのオーケストレーションシステム)の意。元の単語の意味は「航海長」あるいは「水先案内人」

DECの技術者である Jan Scherpenhuizen 氏が1985年に自分のメールアドレスにこの省略方法を使ったのが最初で、そこから広まったようです。

上記 wikipedia には他にも(あまり見かけない)ヌメロニムの例が列挙されています。

disemvoweling

変数名や関数名などを英単語とつなげて作ると名前が長くなるために、時として母音を省略して子音だけ残して命名することがあります(あるいは単独の母音は残すなどのバリエーションがある)。
変数名・関数名などに使うと可読性が落ちるため、最近ではよく批判の対象になっていると思います。
(例外的に GO 言語では、よく使われる略語であれば OK としているようです)

この省略法を英語では disemvoweling と呼ぶようです。
母音(vowel)と内臓摘出(disembowel)という言葉を組み合わせた造語だそうです。腸(bowel)の代わりに母音(vowel)を抜くという意味でしょう。

母音を抜いて(あるいは母音を * などでマスクして)表現することは、古くから行われてきたようですが、最近は SMS (携帯電話でのショートメッセージなど)や、SNS (ツイッターやその他のソーシャルメディア)で頻繁に使われるようになったようです。

ちなみに、トレーディングカードゲームのマジック:ザ・ギャザリングのカードにも「Disemvowel」というものがあるようです。

さらに余談ですが、文字体系として子音のみを表記し、母音は表記しないというものを「アブジャド(abjad)」というそうです。フェニキア文字やヘブライ文字がそうですね。

名前重要

書籍「プログラマが知るべき 97 のこと」の中の「日本人プログラマによる知っておくべき 10 のこと」の中の、Ruby の父 まつもとさんのエッセイ。

ついでに

あわせて GW に書いた駄文です。気が向いたら読んでください。

TODO

  • Rust のターボフィッシュ演算子 ::<...>
  • yet another 系
395
328
21

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
395
328