give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

英語の変数名やメソッド名を考えるときのアプローチについて 〜文脈を意識しながら使える単語を探そう〜

はじめに

この記事は「フィヨルドブートキャンプ Part 2 Advent Calendar 2024」16日目の記事です。

adventar.org

Part 1もあります。

adventar.org

自己紹介

僕はフィヨルドブートキャンプでメンターをやっている伊藤淳一です。
プログラミング歴は20年のベテランプログラマです。

フィヨルドブートキャンプでは日々、生徒さんにプログラミングを教えています。
これからプログラミングを学ぼうとしている方はぜひ、フィヨルドブートキャンプで僕と一緒に勉強していきましょう!😄
bootcamp.fjord.jp

この記事で紹介すること

ところで、みなさんは変数名やメソッド名を考えるのは得意ですか?
ぱっと英語の変数名やメソッド名が出てきますか?
多くの人は「うっ、苦手です……」と答えるのではないでしょうか?

かく言う僕も苦手です😅
というか、時間がかかります。
コードを書く時間は経験とともに速くなるけど、いい名前を考える時間だけはなかなか速くなりません。

とはいえ、自分の中で「こういうふうにやるといいかも」というアプローチがあるので、このエントリではそれを紹介してみます。

【もくじ】

やりません🙅‍♂️→自動翻訳ツールを使う、ChatGPTに聞く、ネーミング辞書サイトを利用する

最初に紹介するのは「この方法は使いません(お勧めしません)」というアプローチです。

英語が苦手な人ってきっと、以下のようなツールを頻繁に使ってるんじゃないでしょうか?

たとえば自動翻訳ツール。

たとえばChatGPT。

たとえばネーミング辞書サイト(codic)。

ですが、僕は滅多にこういった方法は使いません。
たまに参考にするときはありますが、こういうサイトで見つけた英単語も「本当にこれでいいのか?」と疑ってかかります。

というのも、日本語→英語って必ずしも1対1で紐付くとは限らないからです。
たとえば「時計」という日本語を英語にする場合、文脈によって"watch"なのか"clock"なのかが変わります。
「彼は部屋の時計を見た」であれば "clock"(壁掛け時計や置き時計)でしょうし、「彼女は素敵な時計を付けている」であれば"watch"(腕時計)になります。

そう、文脈。
文脈が大事なんです。

なので、僕は「単語 to 単語 (JP to EN)」の単純な翻訳ではなく、なるべく文脈を加味した上でどういう単語を使うべきかを考えるようにしています。
そうでないと、room.replace_watchというような的外れなメソッド名を付けてしまうかもしれません。

じゃあ、文脈的に正しい英語はどうやって探せばいいの?と思いますよね。
以下でその疑問に答えていきます。

英語版Wikipediaを参考にする

たとえばボウリングのスコア計算プログラムを作成する場合、ボウリングに関する変数名やメソッド名を考えないといけません。
こういう場合、英語でボウリングのルールを説明しているページを見て、その中で使われているどの単語がどういう目的で使われているのかをチェックします。

英語版Wikipediaなんかはそういった用途に打ってつけです。
en.wikipedia.org

たとえば以下のスコア表の赤い枠はフレーム(frame)と呼びますが、緑色の枠はなんと呼べばいいでしょうか?

英語版Wikipediaからそれらしき説明文を抜粋してみます。

Traditional scoring

In traditional scoring,[36][37] one point is scored for each pin that is knocked over, and when fewer than all ten pins are knocked down in two rolls in a frame (an open frame), the frame is scored with the total number of pins knocked down. However, when all ten pins are knocked down with either the first or second rolls of a frame (a mark), bonus pins are awarded as follows:

(自動翻訳)
伝統的なスコアリング
伝統的なスコアリングでは、倒したピン1本につき1点が加算されます。また、1フレームで2投以内に10本すべてのピンを倒せなかった場合(オープンフレーム)、そのフレームの得点は倒したピンの合計数となります。しかし、1フレームで1投目または2投目で10本すべてのピンを倒した場合(マーク)、以下のようにボーナスポイントが加算されます。

Ten-pin bowling - Wikipedia

"in two rolls in a frame"や"the first or second rolls of a frame"という記述が見えるので、どうやら緑色の枠は"roll" (first roll, second roll) と呼べば良さそうだ、ということがわかりますね。

公式リファレンスやREADMEを参考にする

たとえばRubyを使って特定のディレクトリにあるファイル名の一覧を取得しなければならないとします。
こういう用途ではDir.entriesメソッドが使えますが、引数と戻り値の変数名は何にすればいいでしょうか?

# fooとbarにどういう名前を付ければいいか?
foo = "./sample"
bar = Dir.entries(foo)

もちろん自力で考えるのもいいのですが、その前に公式リファレンス(英語版)をチェックしてみましょう。

entries(dirname, encoding: 'UTF-8') → array
Returns an array of the entry names in the directory at dirpath; sets the given encoding onto each returned entry name:

https://docs.ruby-lang.org/en/3.3/Dir.html#method-c-entries

どうやら第1引数はdirnameと呼んでいるようです。
また、戻り値については"Returns an array of the entry names"という説明があります。

これらの情報を合わせると、以下のような命名にすると良さそうです。

dirname = "./sample"
entry_names = Dir.entries(dirname)

公式リファレンスだけでなく、READMEファイルについても同じアプローチが使えます。
ライブラリを利用する場合はそのライブラリのREADMEを読んで、サンプルコードや説明文から使えそうな名前を探してみましょう。

シソーラスや英英辞典を使う

訳語が全然思いつかない日本語を英語にしたいときは、僕も自動翻訳ツールを利用することがあります。
そこで提示された単語が「あ、そうそう、これだよね!」と確信の持てるものだったときはいいんですが、「えっ、これ、本当に合ってるのかな?」と不安になるケースもあります。

自動翻訳ツールが提示した単語にしっくりこない場合はシソーラス(類語辞典)を使ってみましょう。
よく似た意味の単語がいくつか表示されるので、「あ、こっちの方が馴染みがあってわかりやすいんじゃない?」という単語が見つかるかもしれません。

たとえば以下は"recognize"という単語をシソーラスで調べたときの結果です(注:"recognize"を選んだことに深い意味はありません)。

https://www.thesaurus.com/browse/recognize

また、その単語を英英辞典で調べるのも有効です。
というのも、英和辞典だと「recognize = 見覚えがある、思い出す」のように対応する日本語を教えてくれるだけなのに対し、英英辞典だとニュアンスを含めて丁寧にその単語の意味を説明してくれることが多いからです。

たとえば以下は英英辞典に載っている"recognize"の説明です。

recognize verb (KNOW)
to know someone or something because you have seen or heard him or her or experienced it before:

(筆者訳)
recognize 動詞 (KNOW)
以前、誰かに会ったり誰かのことを聞いたり、何かを経験したりしたために、その誰かやその何かを知っていること

https://dictionary.cambridge.org/dictionary/english/recognize

どうでしょう?英英辞典の説明には、単に「見覚えがある」「思い出す」と訳される以上の情報量があると思いませんか?
たとえば、この説明を読む限り、"recognize"は「見覚えがある」だけでなく「聞き覚えがある」という意味でも使えそうですよね。

なので、「本当にこれでいいの?」と思った単語は英英辞典を参照して、本当にニュアンス(≒英語ネイティブの視点から見たときの意味)が合っているのかどうか確認してみるといいでしょう。

画像検索を使う

「シソーラスや英英辞典なんて敷居が高い!英語の意味を調べるのにさらに英語を読むなんて苦痛で仕方がない!」という人は、画像検索を使うのも一手です。

たとえば、あなたはキッチンで使う「コンロ」という変数名を使いたくなったとします。
翻訳ツールを使うと"stove"と表示されました。

「えっ、ストーブ?ストーブって、こういうやつじゃないの!?」って思いませんか?

そこで"stove"で画像検索をしてみましょう。
するとこんな結果になりました。

へえ〜、どうやら合ってるみたいですね!

・・・と、こんなふうに画像検索を使って、英単語の使われ方やニュアンスを確認することもできます。

同僚に相談する

業務で使うややこしい用語は、あまり日本人に馴染みのない英語で表現せざるを得ないこともあります。
いったん命名したものの、「なんかしっくりこない」とか「こんな名前だとみんな理解できないんじゃないか」と思ったときは、「ねえねえ、○○するメソッドの名前を△△にしてみたんだけど、これどう思う?」と、同僚(英語に詳しそうな人ならなお良し)に相談してみましょう。

もし、同僚も「うーん、それはちょっとわかりにくいなあ」と首をかしげるようなら、同僚と一緒にもっといい名前を検討しましょう。

あえてローマ字を使う

ビジネスドメイン(特定の業界)で使われる専門用語は英語に訳しにくいものが多いです。
たとえば「給水装置認証登録番号」という変数名を定義しなければいけなくなったら、あなたはどうしますか?

「codicで調べるかなー」ですって?じゃあ、やってみましょうか。

なるほど、給水装置認証登録番号=water_supply_equipment_authorization_registration_numberか。よし!・・・ってなりますか?

日本国内で開発・運用するシステムであれば、業界の専門用語は直訳調の意味不明な英語よりもそのままローマ字にした方がわかりやすいケースもあります。
なので、僕だったら「給水装置認証登録番号」は、

water_supply_equipment_authorization_registration_number

ではなく、

kyusui_sochi_ninsho_toroku_bango

と名付けますね。

機械的に何が何でも変数名やメソッド名は英語にしないといけない、という固定概念は捨てましょう。

もし、どうしても、どうしても英語にしないといけない、という場合は、codicや自動翻訳ツールを頼りにするのではなく、英語で書かれた公式の文献(たとえば英語版の取扱説明書や技術仕様書等)を探す方が、正しい訳語にたどり着けるはずです。

もしくは:「給水装置認証登録番号」を日本語のまま変数名にする!?

ちなみにプログラミング言語によっては日本語の変数名やメソッド名が使えるものもあります。
僕が普段よく使っているRubyもそうです。
ですので、思い切って日本語を使ってみる、というのもアリかもしれません。

給水装置認証登録番号 = "ABC-123456-789"

僕は過去に実際にやってみたことがあります(といってもほんの数回だけですが)。
ただし、突然こんなコードが登場すると開発メンバーがビックリするので、事前にチーム内で合意を取っておきましょう。

日常的な取り組みとして:OSやツールの言語設定を英語にする

変数名やメソッド名を英語で名付けるときは、当然英語の語彙力がたくさんあった方が有利です。
ではどうすれば語彙力を増やすことができるでしょうか?

単語帳を買って毎日勉強する?英会話学校に通う?

いえいえ、もっと簡単でまったくコストのかからない方法があります。
それはOSやツールの言語設定を英語にする、という方法です。

こうすると日常的にパソコンを使いながら、システムでよく使われる英単語を自然に学習することができます。
日常的に英語に触れる機会が増えますし、知らない単語が混じってても「こういう意味かな?」推測しやすいので、自然と語彙が増えていきます。

たとえば以下はディスプレイの設定を変更したときに表示される確認ダイアログの表示例です。

confirm, revert, previousといった単語はプログラミングの世界でもよく登場しますよね。
「手前のディスプレイ設定」を英語にしようとするとき、人によっては「手前=before?」と考えるかもしれませんが、こういうケースではbeforeではなく、previousを使った方がいい、ということもわかります(そもそもbeforeは副詞または前置詞で、previousは形容詞なので、品詞として互換性がありません)。

我々プログラマが必要としているのはIT技術関連の英語であって、日常会話で使う英語ではないので、OSの英語表示はそのへんで売ってる単語帳を買ってくるよりもはるかに効率良く「IT技術でよく使われる英語」を学習できます。

さあ、今すぐOSの言語設定を英語に変更しましょう!
VS Codeの日本語化パックはアンインストール!
XやFacebookといったSNSも言語設定を英語に変更!

もちろん僕も昔からOSやツール類の言語設定はずっと英語にしています。

まれに変なトラブルに遭遇することがあるので注意!!

ただし、たま〜に言語設定が英語だとうまく動かないツールがあったりするので注意してください。
たとえば確定申告のときとかに使う「QRコード付証明書等作成システム」はOSが英語表示だとエラーが出て画面が表示されません。

READMEやAPIドキュメントは英語のまま読もう

加えて、日常的な取り組み・心がけとして、READMEやAPIドキュメントはなるべく英語のまま読む、ということもお勧めしたいです。
「わっ、英語だ!自動翻訳、自動翻訳!!」ということを毎回繰り返していると、なかなか英語力や語彙力は向上しません。

あえて英語のまま読むことで、自然と英語力が向上していきます。
自動翻訳を使うにしても、無条件に全文をツールに放り込むのではなく、わからないところだけをピックアップして自動翻訳するのがいいと思います。

英文は苦手!英語なんて絶対読めない!って思う人も多いかもしれませんが、READMEファイルやAPIドキュメントで使われる英単語って意外と同じようなものしか出てこないんですよ。
なので、英字新聞を読んだりするのに比べるとずっとラクですし(←僕は一時期、英字新聞を読んでました)、READMEやAPIドキュメントでよく使われる英単語はそのまま変数名やメソッド名に流用できるものも多いです。

自動翻訳を使えば一瞬で英文の意味がわかるかもしれませんが、その一方で英語の語彙力はまったく向上しません。
自力でREADMEやAPIドキュメントを読んだ方が、英語の語彙力が向上し、将来変数名やメソッド名を考える時間を短縮できるはずです。
ぜひ、READMEやAPIドキュメントを英文のまま読む習慣を身につけてください!

まとめ

というわけで、この記事では僕が英語の変数名やメソッド名を考えるときのアプローチや日々の取込み・心がけについて書いてみました。

どれも即座に効果が出る銀の弾丸とは言えませんが、自動翻訳に頼ってばかりだと英語力は向上しないですし、文脈的になんかおかしい的外れな変数名やメソッド名を付けがちになってしまいます(知らない間にroom.replace_watchみたいなメソッド名を付けてるかも!?)。

ここで紹介したような方法を使って、コツコツと英語力を向上させていきましょう!💪

というわけで、明日の「フィヨルドブートキャンプ Advent Calendar 2024」もお楽しみに!!

adventar.org
adventar.org
bootcamp.fjord.jp

あわせて読みたい

変数名やメソッド名を考えるときは、単純に単語を組み合わせるだけでなく、その品詞についても意識した方が良いです。
品詞に関する考え方は以下の記事に詳しく書いているので、こちらもぜひチェックしてみてください。
qiita.com

近況など

iPhoneを買い換えた

iPhone 13 miniを2年半ぐらい使ってたので、iPhone 15に買い換えました。

ミニサイズは結構気に入ってたんだけど、新機種がいっこうに発売されそうにないので「このまま待ち続けてもたぶんダメだな」と思って、普通のサイズに切り替えました。
色はなんとなく「今まで使ったことない色にしてみよう」と思ってブルーにしました(←こだわりなし)。

スマホにそこまで最新機能は求めていないので、iPhone 16じゃなくてあえて15にしました。ちょっと安くなってたし。
「このタイミングで機種変更しておかないと、来年の新機種が出るまでしばらく割引されないから、そろそろ変えたら?」と妻に言われて、「せやなあ、3年以上iPhone 13 miniを使い続けるのはちょっと長すぎるかもしれんな〜」と思って、えいやーと変えてみた、という理由もあります。

「え、今頃?」と思われるかもしれませんが、今回初めて店に行かずに自分で機種変更しました。
eSIMなのでSIMカードを入れ替える必要もないし、2台のスマホを並べたら勝手にデータ移行してくれるし、めちゃくちゃ楽ちんですね。
時代は進化しましたなあ。

大きなiPhoneはやっぱり大きい。重い。画面の端から端まで指が届かない。
その代わり画面が大きいので小さな字はちょっと見やすい。
あと、iPhone 13 miniに比べると全体的にキビキビ動く。
大きい・重いと言っても非現実的なレベルではないので、「まあこんなもんか」と思いながら使うぶんには許容範囲かなーという感じです。

兵庫県民、兵庫県民っていうな💢

最近ネットを見てると「これが兵庫県民が望んだ結果」とか「兵庫県民はみんな○○」みたいなコメントを頻繁に見かけてうんざりしてます。
いわゆる「主語でかすぎ」ってやつですね。
兵庫県民が全員同じこと考えて同じ行動してると思うなよ!!

住んでるところとか、出自だとか、そういう属性で人間をひとくくりにしてあーだこーだ断定するのは非常に良くないですね。
一種の差別発言じゃないでしょうか。
とはいえ、僕も今まで「これだから○○人は〜」みたいに思ったことがまったくないかと言われると、決してそうではないので、今回の件でちょっと人の痛みがわかったような気がします。

そして、何かに付けて兵庫県民、兵庫県民、って言ってる人たち。
明日は我が身かもしれないんだからな。
いつか「○○県民ってみんな×××なんでしょ?」って言われる日が来るぞ!

しかし、それにしても今回の選挙は本当に気持ち悪かった。
周りのおばさま方がこぞって「YouTube見た?あの話って本当は〜」みたいなことを言い出して、SNSやYouTubeの情報に見事に飲み込まれていってたので。

詐欺師は複雑な問題を極度に単純化して断言する。
しかも、スカッとする気持ちのいい物言いで。

「いいですかみなさん、Aは実はBだったんです!だから本当はCがDなんです!!」という話を聞いて、「いやいや、そんなことは言い切れんやろ」とか「それとこれとは話が別やって」と、自分は思っていても、「へえ、そうなんだ、知らなかった。我々は今まで騙されていたのか!」と考える人はやっぱり一定数いるんですよね。。

あと、敵と味方、悪と正義に二分化する考え方も非常に怖い。

「あいつは悪いやつだから我々の敵」
「こちらは正義」
「悪いやつはこてんぱんにやっつけても構わない」
「あなたも当然、"我々"サイドですよね?(まさか、まさか、敵サイドだったりしませんよね!?)」

みたいな空気が流れるのが非常に気持ち悪かった。
「あなたも当然、"我々"サイドですよね?」みたいな態度で来られると、非常に返事に困る。

そもそも同じ県の中で、敵と味方に分かれること自体おかしい。
そんなのよくないよ、そんなことしても平和は訪れないよ。

こういうのがアジテーションとか、プロパガンダっていうやつ?
そんな話は遠い過去の話か、遠い外国の話だと思ってたけど、現代の日本でも「あいつは敵だ、我々は正義だ」みたいな物言いで人民を扇動する輩が現れると、意外と簡単にそういう良からぬ空気を作り出すことはできてしまうんだ、という不気味さを感じました。

一度そういう「空気」ができあがってしまうと、すーっとその空気に同調してしまう人(もしくは空気に飲まれることで安心感を得る人)は非常に多いので、「歴史で習った話」とか「ニュースで聞いた遠い外国の話」が一瞬で現実のものとして襲いかかってくる可能性はゼロじゃないんだな、と思いました。

これ、兵庫県だけの問題じゃないですよ?
「自分は大丈夫」と思っていても、「自分の住んでる県(=県民全員)が大丈夫」っていう保証はないですからね?
自分をとりまく空気があっという間に変わってしまう可能性は十分ありますよ??

あ、あと僕から言いたいのは「頼むから兵庫県をおもちゃにしないでくれ、笑いものにしないでくれ」ということです。
この半年ぐらい、兵庫県に関してはロクな話題を聞かないので、早く平和で平穏な日々が訪れてほしいと願うばかりです😔

みんなで作ろう、変なカレンダー!! 第5回スキルアップ勉強会「コードレビューライブ 〜伊藤淳一からの挑戦状 part2〜」を開催します #sgtech

お知らせ

またまたやります、コードレビューライブ!
というわけで、弊社ソニックガーデン主催の 第5回スキルアップ勉強会「コードレビューライブ 〜伊藤淳一からの挑戦状 part2〜」 のお知らせです。

sonicgarden.connpass.com

開催日時は2024年12月9日(月) 20時です。
今回もオンライン開催ですので、みなさんどうぞお気軽にご参加ください!

「コードレビューライブ」って何なん?

コードレビューライブは、

  1. 僕がプログラミングのお題を出し、
  2. 参加者のみなさんがそのお題を解いて提出し、
  3. 当日僕がその場でコードレビューする、

そんな勉強会です!

コードレビューを通じて、良いコードを書く上で大事な考え方や実践的なフィードバックをみなさんに提供できればと考えています。

ちなみに、コードは書かずに当日勉強会に参加してコードレビューの様子を眺めるだけ、でもOKです。
ですが、自分で事前にコードを書いておいた方が、当日の学びが100倍アップすると思います!

今回のお題は「変なカレンダー生成問題」です

今回の勉強会では、みなさんに「見にくくてあまり実用性のない、変なカレンダー」を生成してもらいます。
ちょっと難しいかもしれないので、挑戦者のレベルにあわせて3つのパターンを用意しました。

レベル1: 横向きに出力

レベル1では年を指定すると、横向きのカレンダーが1年分出力されます。

calendar = SgStrangeCalendar.new(2024)
puts calendar.generate

上のプログラムを実行して、以下のようなカレンダーが出力できれば完成です。
いやあ、とても見にくいですね、実用性ゼロ!(苦笑)


レベル2: 今日の日付を強調

「そんなの簡単、簡単!」という人はレベル2へ。
レベル2では今日の日付を[ ]で囲んで強調表示します。

以下は今日の日付が2024年12月9日だった場合のコードと、その出力例です。

calendar = SgStrangeCalendar.new(2024, Date.today)
puts calendar.generate

ちょっとわかりにくいかもしれませんが、12月9日の"9"が[9]になっています。


レベル3: 縦向きに出力

「レベル2も余裕でしたけど?」という人はレベル3にチャレンジ!
レベル3はレベル2の縦向きバージョンです。 行と列を入れ替えてカレンダーを出力します。

calendar = SgStrangeCalendar.new(2024, Date.today)
puts calendar.generate(vertical: true)

generateメソッドにvertical: trueオプションを渡しているので、カレンダーは下のように縦向きで出力されます。
12月9日の日付が[9]になっている点にも注目してみてください。


「よっしゃ、チャレンジしたる!」という人はプルリクを送ってね😘

プログラム仕様の詳細や解答の方法については以下のGitHubリポジトリで説明しているのでこちらをご覧ください。

github.com

上記リポジトリをフォークし、コードを書いてプルリクエストを作成すれば提出完了です!

なお、予めテストコードが用意してあるので、問題が解けたかどうかはテストが全パスするか否かで判断できます。

↓こんなふうにテストが全パスすればOKです。

$ ruby test/sg_strange_calendar_test.rb --no-plugins
Run options: --seed 16463

# Running:

.........

Finished in 0.001414s, 6364.9222 runs/s, 6364.9222 assertions/s.

9 runs, 9 assertions, 0 failures, 0 errors, 0 skips

レベル3は必須ではありません。
レベル1で提出してもらっても良いですし、腕に自信がある人はレベル2、レベル3と進んでもらってもOKです。
みなさんが「ここまでならできそう」というレベルまで完成したら、解答コードを提出してください。

前回のコードレビューライブの様子や反響など

前回のコードライブでは「ローマ数字変換プログラム」をお題として出していました。

romanizer = SgRomanizer.new

# アラビア数字 → ローマ数字
romanizer.romanize(1) #=> "I"
romanizer.romanize(2) #=> "II"
romanizer.romanize(3) #=> "III"
# ...
romanizer.romanize(3999) #=> "MMMCMXCIX"

# ローマ数字 → アラビア数字
romanizer.deromanize("I")   #=> 1
romanizer.deromanize("II")  #=> 2
romanizer.deromanize("III") #=> 3
# ...
romanizer.deromanize("MMMCMXCIX") #=> 3999

こんな感じで、僕が画面共有しながら、RubyMine上で提出されたコードにコメントしたり、リファクタリングしていました。


Image:あなたのコードをその場でレビュー&リファクタリング!「コードレビューライブ - 株式会社ソニックガーデン

当日のXのポストから、参加者のみなさんのコメントをいくつか紹介させていただきます。

参加してくださったみなさん、どうもありがとうございました!

まとめ

というわけで、今回は2024年12月9日(月)に開催するオンライン勉強会「第5回スキルアップ勉強会・あなたもチャレンジ!コードレビューライブ 〜伊藤淳一からの挑戦状 part2〜」についてお知らせしました。

前回参加した人も、そうでない人も、ぜひご参加ください。
あなたの書いたコードをお待ちしています!😄

sonicgarden.connpass.com